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 8 Stream API 轉換到 Kotlin 集合APIJavaAPIKotlin
- Guava集合--Immutable(不可變)集合Guava
- Java中如何快捷的建立不可變集合Java
- Python中的不可變集合Python
- Java Stream和Collection比較:何時以及如何從Java API返回Stream而不是集合Collection? - TomaszKiełbowiczJavaAPI
- Java中的不可變集合,我們換個方式理解!!!Java
- Java原始碼分析:Guava之不可變集合ImmutableMap的原始碼分析Java原始碼Guava
- Java Stream API groupingBy()介紹JavaAPI
- Java8中的Stream APIJavaAPI
- Java8 Stream常用API整理JavaAPI
- Java8的Stream API使用JavaAPI
- java .stream(). 使用介紹 Streams APIJavaAPI
- java8 Stream APi 入門JavaAPI
- Java8新特性--Stream APIJavaAPI
- Java™ 教程(不可變物件)Java物件
- Java8 - Stream API快速入門JavaAPI
- 7個Java Stream API面試題JavaAPI面試題
- Java 8 Stream Api 中的 peek 操作JavaAPI
- Stream APIAPI
- java學習(七) —— API集合類JavaAPI
- Java Stream API:實現 Kruskal 演算法JavaAPI演算法
- Go語言實現的Java Stream APIGoJavaAPI
- Java8中的 lambda 和Stream APIJavaAPI
- Java8 Stream,簡潔快速處理集合(上)Java
- Java8 Stream,簡潔快速處理集合(下)Java
- Java8 新特性 Stream流操作List集合 (二)Java
- Java8的stream流讓操作集合更容易Java
- java stream()流對兩個集合進行比對Java
- Java中實現不可變MapJava
- Java 8中處理集合的優雅姿勢——StreamJava
- Java 8 Stream API: 深入理解與高效使用JavaAPI
- 深入理解Java中的不可變物件Java物件
- Java中的不可變資料結構Java資料結構
- 使用Java Stream API中DistinctBy刪除重複資料JavaAPI
- Java StreamJava
- Java集合從菜鳥到大神演變Java
- Java併發設計模式--不可變模式(immutable)Java設計模式