![](/img/trans.png)
[英]Doesn't Stream.parallel() update the characteristics of spliterator?
[英]Which stream operations use `CONCURRENT`,`IMMUTABLE` and `NONNULL` Spliterator characteristics?
哪些流操作使用CONCURRENT
, IMMUTABLE
和NONNULL
分隔符特征? 他們每個人如何幫助這些行動?
我不是在問那些標志是什么,可以在文檔中輕松找到。 我在問哪些操作使用它們以及如何使用它們。
首先,您應該明確區分您在此處詢問的Spliterator
特性,這些取決於Stream的來源 。 因為也有(例如, Collectors
CONCURRENT
, UNORDERED
和IDENTITY_FINISH
)。
StreamOpFlag
有一條評論說:
// The following Spliterator characteristics are not currently used but a
// gap in the bit set is deliberately retained to enable corresponding
// stream flags if//when required without modification to other flag values.
//
// 4, 0x00000100 NONNULL(4, ...
// 5, 0x00000400 IMMUTABLE(5, ...
// 6, 0x00001000 CONCURRENT(6, ...
// 7, 0x00004000 SUBSIZED(7, ...
據我了解,這些不是與Spliterator的直接一對一映射,但仍未使用。
目前 (並且我已經搜索了jdk-8和9來源),兩者都沒有被利用-但是仍然由Spliterators的一些實現報告(例如, Arrays
報告IMMUTABLE
而ConcurrentHashMap
報告NONNULL
)。
另一方面,這些標志可能會在將來使用-如果您知道某個源不能包含null元素( NONNULL
),則顯然可以跳過某些null檢查或使用null定義某些狀態 。 我想不出任何CONCURRENT
或IMMUTABLE
示例,但是可能有這樣的示例。
例如,在當前實現下,用於UNORDERED
和CONCURRENT
收集器(!= Spliterator
屬性),在執行toConcurrentMap
時不調用combiner
。 例如:
Set.of("one", "two", "das", "dasda")
.stream()
.parallel()
.collect(Collectors.toConcurrentMap(Function.identity(), String::length));
不會調用combiner
-因為沒有必要。
可以針對您提到的3個特征中的任何一個進行此類優化。 例如,您可以閱讀以下內容 ,其中StreamOpFlag.ORDERED
更改了Java 8 vs Java 9中findFirst
的結果
在Java 8中,流操作既不使用這三個特征。 可以通過在Java源代碼中搜索這些常量來檢查。
但是,當您編寫自己的集合時, CONCURRENT
特性可能會影響並行流的行為。 如果您從集合中創建一個Spliterator
並且未報告CONCURRENT
特征,則該拆分器將另外具有SIZED
和SUBSIZED
特征:
Collection<Integer> col = ...
Spliterator<Integer> s = Spliterators.spliterator(col, 0);
System.out.println(s.hasCharacteristics(Spliterator.SIZED)); // Prints true
System.out.println(s.hasCharacteristics(Spliterator.SUBSIZED)); // Prints true
但是,如果你報告CONCURRENT
的特點,那么spliterator不SIZED
了:
Collection<Integer> col = ...
Spliterator<Integer> s = Spliterators.spliterator(col, Spliterator.CONCURRENT);
System.out.println(s.hasCharacteristics(Spliterator.SIZED)); // Prints false
System.out.println(s.hasCharacteristics(Spliterator.SUBSIZED)); // Prints false
非SIZED
和SUBSIZED
器並行SUBSIZED
程度較差,因此在編寫自己的並發集合時,最好編寫自定義拆分器,而不依賴於默認的拆分器實現。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.