Java 10中Stream API不可變集合
不可變資料結構能夠應對高併發,無鎖併發,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());