Java 10中Stream API不可变集合

栏目: Java · 发布时间: 5年前

内容简介:不可变数据结构能够应对高并发,无锁并发,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());

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

网络多人游戏架构与编程

网络多人游戏架构与编程

格雷泽 (Joshua Glazer)、马达夫 (Sanjay Madhav) / 王晓慧、张国鑫 / 人民邮电出版社 / 2017-10-1 / CNY 109.00

本书是一本深入探讨关于网络多人游戏编程的图书。 全书分为13章,从网络游戏的基本概念、互联网、伯克利套接字、对象序列化、对象复制、网络拓扑和游戏案例、延迟、抖动和可靠性、改进的延迟处理、可扩展性、安全性、真实世界的引擎、玩家服务、云托管专用服务器等方面深入介绍了网络多人游戏开发的知识,既全面又详尽地剖析了众多核心概念。 本书的多数示例基于C++编写,适合对C++有一定了解的读者阅读。本......一起来看看 《网络多人游戏架构与编程》 这本书的介绍吧!

随机密码生成器
随机密码生成器

多种字符组合密码

URL 编码/解码
URL 编码/解码

URL 编码/解码

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具