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]]