Collectors.toUnmodifiableList in java-10

2022-09-04 01:03:41

如何使用 创建 List/Set/Map,因为(等)的文档为:UnmodifiableCollectors.toList/toSet/toMaptoList

对返回的列表的类型、可变性、可序列化性或线程安全性没有保证

java-10 之前,您必须提供 一个 ,例如:FunctionCollectors.collectingAndThen

 List<Integer> result = Arrays.asList(1, 2, 3, 4)
            .stream()
            .collect(Collectors.collectingAndThen(
                    Collectors.toList(),
                    x -> Collections.unmodifiableList(x)));

答案 1

使用Java 10,这更容易,更具可读性:

List<Integer> result = Arrays.asList(1, 2, 3, 4)
            .stream()
            .collect(Collectors.toUnmodifiableList());

在内部,它与 相同,但返回在 Java 9 中添加的不可修改的实例。Collectors.collectingAndThenList


答案 2

此外,为了清除两个(vs)实现之间的记录差异:collectingAndThentoUnmodifiableList

将返回一个不允许空值的收集器,如果显示 null 值,则会抛出。Collectors.toUnmodifiableListNullPointerException

static void additionsToCollector() {
    // this works fine unless you try and operate on the null element
    var previous = Stream.of(1, 2, 3, 4, null)
            .collect(Collectors.collectingAndThen(Collectors.toList(), Collections::unmodifiableList));

    // next up ready to face an NPE
    var current = Stream.of(1, 2, 3, 4, null).collect(Collectors.toUnmodifiableList());
}

此外,这是因为前者构造一个实例,而后者构造一个实例,该实例添加到使用静态工厂方法带到表中的属性列表中。Collections.UnmodifiableRandomAccessListImmutableCollections.ListN


推荐