Guava 不可变集合之 ImmutableSet


#Java Guava 库


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]


( 本文完 )