Guava 不可变集合之 ImmutableList


#Java Guava 库#


Guava 提供的 ImmutableList 是一个不可变的List。不可变的意思是,对象生成后,向里面添加元素,也不能删除元素。

构造 ImmutableList 的三种方式

构造方式1:of 方法

import com.google.common.collect.ImmutableList;

import java.util.List;

public class ImmutableListTest {

    public static void main(String[] args) {
        List<String> immutableList = ImmutableList.of("a", "b");
        System.out.println(immutableList);  // 输出 [a, b]
    }

}

构造方式2:copyOf 方法

copyOf 方法可以将一个集合转换成 ImmutableList

import com.google.common.collect.ImmutableList;
import com.google.common.collect.Lists;

import java.util.List;

public class ImmutableListTest {

    public static void main(String[] args) {
        List<String> list = Lists.newArrayList("a", "b");
        List<String> immutableList = ImmutableList.copyOf(list);
        System.out.println(immutableList); // 输出 [a, b]
    }

}

构造方式3:builder 模式

import com.google.common.collect.ImmutableList;
import com.google.common.collect.Lists;

import java.util.List;

public class ImmutableListTest {

    public static void main(String[] args) {
        List<String> immutableList = ImmutableList
                .<String>builder()
                .add("a")
                .add("b")
                .build();
        System.out.println(immutableList);  // 输出 [a, b]
    }

}

验证 ImmutableList 不可修改

如果对 ImmutableList 对象,再添加元素会报错,例如:

List<String> list = ImmutableList.of("a", "b");
list.add("c");

运行时会抛出异常:java.lang.UnsupportedOperationException

ImmutableList 中元素不允许为 null

import com.google.common.collect.ImmutableList;

import java.util.List;

public class ImmutableListTest {

    public static void main(String[] args) {
        List<String> immutableList = ImmutableList.of(null, "a"); // 运行时报错 java.lang.NullPointerException
        System.out.println(immutableList);
    }

}

那么有没有办法将 null 值塞进去?有,用 Optional 包装一下 null。不过代码会变得稍微复杂:

import com.google.common.collect.ImmutableList;

import java.util.List;
import java.util.Optional;

public class ImmutableListTest {

    public static void main(String[] args) {
        List<Optional<String>> immutableList = ImmutableList.of(
                Optional.ofNullable(null),
                Optional.of("a")
        );
        System.out.println(immutableList);
    }

}

执行结果是:

[Optional.empty, Optional[a]]

( 本文完 )