Java 10中Stream API不可變集合

banq發表於2018-09-24
不可變資料結構能夠應對高併發,無鎖併發,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)
<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 10 Immutable/Unmodifiable Stream API Collecto

相關文章