首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >java-10中的Collectors.toUnmodifiableList

java-10中的Collectors.toUnmodifiableList
EN

Stack Overflow用户
提问于 2018-03-05 09:06:29
回答 4查看 3.8K关注 0票数 14

如何使用Unmodifiable创建Collectors.toList/toSet/toMap列表/Set/Map,因为toList (以及类似的)文档如下:

对于返回的列表的类型、可更改性、可序列化性或线程安全性没有任何保证。

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

代码语言:javascript
复制
 List<Integer> result = Arrays.asList(1, 2, 3, 4)
            .stream()
            .collect(Collectors.collectingAndThen(
                    Collectors.toList(),
                    x -> Collections.unmodifiableList(x)));
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2018-03-05 09:06:29

使用Java 10,这要容易得多,而且可读性要强得多:

代码语言:javascript
复制
List<Integer> result = Arrays.asList(1, 2, 3, 4)
            .stream()
            .collect(Collectors.toUnmodifiableList());

在内部,它与Collectors.collectingAndThen相同,但返回一个不可修改的List实例,该实例是在Java9中添加的。

票数 13
EN

Stack Overflow用户

发布于 2018-03-05 10:10:35

此外,为了消除这两种(collectingAndThentoUnmodifiableList)实现之间的文档差异:

null将返回一个不允许空值的收集器,如果它显示了一个Collectors.toUnmodifiableList值,它将抛出NullPointerException

代码语言:javascript
复制
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的实例,该实例添加了静态工厂方法。表中的属性列表

票数 8
EN

Stack Overflow用户

发布于 2021-01-19 11:34:47

Stream#toList

Java 16Stream接口上添加了一个方法:toList()。引用Javadoc:

返回的List是不可修改的;对任何mutator方法的调用都会导致抛出UnsupportedOperationException

这种方法不仅比Collectors更方便,而且有一些好处,比如在并行流上的性能更好。

特别是使用并行() --因为它避免了结果复制。Benchmark是在100 K长流上的几个简单操作。

欲进一步阅读,请访问:http://marxsoftware.blogspot.com/2020/12/jdk16-stream-to-list.html

在简历中,链接声明如下所示。

理解:进入一个人的代码库并使用stream.toList()作为stream.collect(Collectors.toList())的替代可能很有诱惑力,但是如果代码对返回ArrayList的stream.collect(Collectors.toList())的实现有直接或间接的依赖,那么行为可能会有所不同。stream.collect(Collectors.toList())和stream.toList()返回的列表之间的一些关键区别在本文的其余部分中得到了说明。 Collectors.toList()的基于Javadoc的文档声明(重点是后加的),“返回一个收集器,它将输入元素累加到一个新列表中。返回的列表的类型、可变性、可序列化性或线程安全性没有保证.”虽然Collectors.toList()提供的列表中的“类型、可变性、可序列化性或线程安全性”没有保证,但预计有些人可能已经意识到它目前是一个ArrayList,并以依赖于ArrayList特性的方式使用它。

我所理解的是,Stream.toList()它将导致一个不可变的列表。

Stream.toList()提供了一个不可变的列表实现(不能添加或排序的类型ImmutableCollections.ListN ),类似于List.of()提供的列表实现,并且与Stream.collect(Collectors.toList())提供的可变(可以更改和排序) ArrayList相反。根据Stream.collect返回的Stream.collect(Collectors.toList())返回的代码的变化能力,任何现有代码都将不能使用Stream.toList(),并且会引发UnsupportedOperationException。 虽然Stream.collect(Collectors.toList())和Stream.toList()返回的列表的实现性质非常不同,但它们仍然实现了列表接口,因此当使用List.equals(Object)进行比较时,它们被认为是相等的。

这个方法将允许空,所以从Java 16开始,我们将有一个

代码语言:javascript
复制
mutable/null-friendly----->Collectors.toList()
immutable/null-friendly--->Stream.toList()
immutable/null-hostile---->Collectors.toUnmodifiableList() //Naughty 

太棒了。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49106767

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档