内容简介:不可变数据结构能够应对高并发,无锁并发,JDK10提供Stream API不可变集合。默认情况下,大多数Stream API集合代表可变的集合策略 - 但是如果想要将元素收集到不可变数据结构会发生什么?首先想到的是将一个不可变集合的实例传递给Collectors.toCollection()集合,但它是一条死路,因为提供的集合是......不可变的,并且在创建之后无法更改:
不可变数据结构能够应对高并发,无锁并发,JDK10提供Stream API不可变集合。
默认情况下,大多数Stream API集合代表可变的集合策略 - 但是如果想要将元素收集到不可变数据结构会发生什么?
首先想到的是将一个不可变集合的实例传递给Collectors.toCollection()集合,但它是一条死路,因为提供的集合是......不可变的,并且在创建之后无法更改:
Stream.of(42).collect(Collectors.toCollection(List::of));
// result
java.lang.UnsupportedOperationException
at ...ImmutableCollections.uoe(ImmutableCollections.java:71)
at ...ImmutableCollections$AbstractImmutableList.add(ImmutableCollections.java:77)
at ...stream.ReduceOps$3ReducingSink.accept(ReduceOps.java:169)
at ...stream.Streams$StreamBuilderImpl.forEachRemaining(Streams.java:411)
从技术上讲,如果Collections / Stream API是以不可变的方式设计的,那么这不会是一个问题。
幸运的是,在JDK 10之前,对上述问题的实用解决方案非常简单。可以像往常一样简单地收集Stream,然后通过利用collectAndThen集合将结果转换为不可修改的结构:
var unmodifiableList = Stream.of(42) .collect(Collectors.collectingAndThen(Collectors.toList(), Collections::unmodifiableList));
Java 10以后专用的本地Collector放到了桌面上,使得使用体验更加顺畅:
toUnmodifiableList()
toUnmodifiableMap()
toUnmodifiableSet()
以上所有都返回了JDK 9中引入的新的不可变实现。
var collect = Stream.of(42) .collect(Collectors.toUnmodifiableList());
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- 集合对象可变与不可变的那点事
- Immutable.js v4.0.0-rc.3 发布,不可变数据集合
- Immutable.js v4.0.0-rc.7 发布,不可变数据集合
- Immutable.js v4.0.0-rc.9 发布,不可变数据集合
- Immutable.js v4.0.0-rc.11 发布,不可变数据集合
- Python中不可变数据类型和可变数据类型
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
About Face 4: 交互设计精髓
[美] 艾伦·库伯、[美] 罗伯特·莱曼、[美] 戴维·克罗宁、[美] 克里斯托弗·诺埃塞尔 / 倪卫国、刘松涛、杭敏、薛菲 / 电子工出版社 / 2015-10 / 118.00元
《About Face 4: 交互设计精髓》是《About Face 3:交互设计精髓》的升级版,此次升级把全书的结构重组优化,更加精练和易用;更新了一些适合当下时代的术语和实例,文字全部重新编译,更加清晰易读;增加了更多目标导向设计过程的细节,更新了现行实践,重点增加 移动和触屏平台交互设计,其实《About Face 4: 交互设计精髓》多数内容适用于多种平台。 《About F......一起来看看 《About Face 4: 交互设计精髓》 这本书的介绍吧!