Guava 提供的 ImmutableSet 是一个不可变的Set(集合)。不可变的意思是,对象生成后,向里面添加元素,也不能删除元素。
构造 ImmutableSet 的三种方式
构造方式1:of 方法
import com.google.common.collect.ImmutableSet;
import java.util.Set;
public class ImmutableSetTest {
public static void main(String[] args) {
Set<String> immutableSet = ImmutableSet.of("a", "b", "a");
System.out.println(immutableSet); // 输出 [a, b]
}
}
构造方式2:copyOf 方法
copyOf 方法可以将一个集合转换成 ImmutableSet
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Lists;
import java.util.List;
import java.util.Set;
public class ImmutableSetTest {
public static void main(String[] args) {
List<String> list = Lists.newArrayList("a", "b", "a");
Set<String> immutableSet = ImmutableSet.copyOf(list);
System.out.println(immutableSet); // 输出 [a, b]
}
}
构造方式3:builder 模式
import com.google.common.collect.ImmutableSet;
import java.util.Set;
public class ImmutableSetTest {
public static void main(String[] args) {
Set<String> immutableSet = ImmutableSet
.<String>builder()
.add("a")
.add("b")
.add("a")
.build();
System.out.println(immutableSet); // 输出 [a, b]
}
}
验证 ImmutableSet 不可修改
如果对 ImmutableList 对象,再添加元素会报错,例如:
Set<String> immutableSet = ImmutableSet.of("a", "b", "a");
immutableSet.add("a");
运行时会抛出异常:java.lang.UnsupportedOperationException
。
ImmutableSet 中元素不允许为 null
import com.google.common.collect.ImmutableSet;
import java.util.Set;
public class ImmutableSetTest {
public static void main(String[] args) {
Set<String> immutableSet = ImmutableSet.of(null); // 运行时报错 java.lang.NullPointerException
System.out.println(immutableSet);
}
}
那么有没有办法将 null 值塞进去?有,用 Optional 包装一下 null。不过代码会变得稍微复杂:
import com.google.common.collect.ImmutableSet;
import java.util.Optional;
import java.util.Set;
public class ImmutableSetTest {
public static void main(String[] args) {
Set<Optional<String>> immutableSet = ImmutableSet.of(
Optional.ofNullable(null),
Optional.ofNullable(null)
);
System.out.println(immutableSet);
}
}
执行结果是:
[Optional.empty]