java-10中的Collectors.toUnmodifiableList

问题描述 投票:13回答:2

如何使用Unmodifiable创建Collectors.toList/toSet/toMap列表/集/地图,因为toList(等)的文档为:

返回的List的类型,可变性,可序列化或线程安全性无法保证

在java-10之前,你必须提供FunctionCollectors.collectingAndThen,例如:

 List<Integer> result = Arrays.asList(1, 2, 3, 4)
            .stream()
            .collect(Collectors.collectingAndThen(
                    Collectors.toList(),
                    x -> Collections.unmodifiableList(x)));
java java-stream java-10
2个回答
10
投票

使用Java 10,这更容易,更易读:

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

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


7
投票

此外,要清除两个(collectingAndThentoUnmodifiableList)实现之间的文档差异:

Collectors.toUnmodifiableList会返回一个不允许空值的收集器,如果它带有NullPointerException值,则会抛出null

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.UnmodifiableRandomAccessList的一个实例,而后者构造了ImmutableCollections.ListN的一个实例,它添加到static factory methods.带到桌子的属性列表中

© www.soinside.com 2019 - 2024. All rights reserved.