Java 10中Stream API不可變集合
不可變資料結構能夠應對高併發,無鎖併發,JDK10提供Stream API不可變集合。
預設情況下,大多數Stream API集合代表可變的集合策略 - 但是如果想要將元素收集到不可變資料結構會發生什麼?
首先想到的是將一個不可變集合的例項傳遞給Collectors.toCollection()集合,但它是一條死路,因為提供的集合是......不可變的,並且在建立之後無法更改:
從技術上講,如果Collections / Stream API是以不可變的方式設計的,那麼這不會是一個問題。
幸運的是,在JDK 10之前,對上述問題的實用解決方案非常簡單。可以像往常一樣簡單地收集Stream,然後透過利用collectAndThen集合將結果轉換為不可修改的結構:
Java 10以後專用的本地Collector放到了桌面上,使得使用體驗更加順暢:
toUnmodifiableList()
toUnmodifiableMap()
toUnmodifiableSet()
以上所有都返回了JDK 9中引入的新的不可變實現。
預設情況下,大多數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) <p class="indent"> |
從技術上講,如果Collections / Stream API是以不可變的方式設計的,那麼這不會是一個問題。
幸運的是,在JDK 10之前,對上述問題的實用解決方案非常簡單。可以像往常一樣簡單地收集Stream,然後透過利用collectAndThen集合將結果轉換為不可修改的結構:
var unmodifiableList = Stream.of(42) .collect(Collectors.collectingAndThen(Collectors.toList(), Collections::unmodifiableList)); <p class="indent"> |
Java 10以後專用的本地Collector放到了桌面上,使得使用體驗更加順暢:
toUnmodifiableList()
toUnmodifiableMap()
toUnmodifiableSet()
以上所有都返回了JDK 9中引入的新的不可變實現。
var collect = Stream.of(42) .collect(Collectors.toUnmodifiableList()); <p class="indent"> |
相關文章
- Java 不可變集合 Stream流以及方法引用Java
- Java中如何快捷的建立不可變集合Java
- Java 8 Stream API 轉換到 Kotlin 集合APIJavaAPIKotlin
- Python中的不可變集合Python
- Java中的不可變集合,我們換個方式理解!!!Java
- Guava集合--Immutable(不可變)集合Guava
- Java 8新特性之旅:使用Stream API處理集合JavaAPI
- Java8中的Stream APIJavaAPI
- Java 8 Stream Api 中的 peek 操作JavaAPI
- Java8中的 lambda 和Stream APIJavaAPI
- Java 8中的Stream API使用指南JavaAPI
- Java中實現不可變MapJava
- Java中建立不可變的類Java
- java 中構建不可變物件Java物件
- Java Stream和Collection比較:何時以及如何從Java API返回Stream而不是集合Collection? - TomaszKiełbowiczJavaAPI
- Object-C,NSSet,不可變集合Object
- Java 8中處理集合的優雅姿勢——StreamJava
- Java8 Lambda表示式與Stream API (二): Stream API的使用JavaAPI
- Java原始碼分析:Guava之不可變集合ImmutableMap的原始碼分析Java原始碼Guava
- Java中的不可變資料結構Java資料結構
- 深入理解Java中的不可變物件Java物件
- Java8的Stream API使用JavaAPI
- Java8新特性--Stream APIJavaAPI
- Java8 Stream常用API整理JavaAPI
- Java 8新特性(二):Stream APIJavaAPI
- java8 Stream APi 入門JavaAPI
- 7個Java Stream API面試題JavaAPI面試題
- 使用Java Stream API中DistinctBy刪除重複資料JavaAPI
- Java™ 教程(不可變物件)Java物件
- Stream APIAPI
- Java8 - Stream API快速入門JavaAPI
- Java Stream API groupingBy()介紹JavaAPI
- Node.js中不可不精的StreamNode.js
- Java中String類不可變性的好處Java
- 使用Java 8的Stream API列出ZIP檔案中的條目JavaAPI
- Node.js 中 Stream API 的使用Node.jsAPI
- Go語言實現的Java Stream APIGoJavaAPI
- 模仿Java Stream API 運算元組/切片JavaAPI