簡體   English   中英

哪些流操作使用“ CONCURRENT”,“ IMMUTABLE”和“ NONNULL”分離器特性?

[英]Which stream operations use `CONCURRENT`,`IMMUTABLE` and `NONNULL` Spliterator characteristics?

哪些流操作使用CONCURRENTIMMUTABLENONNULL分隔符特征? 他們每個人如何幫助這些行動?


我不是在問那些標志是什么,可以在文檔中輕松找到。 我在問哪些操作使用它們以及如何使用它們。

首先,您應該明確區分您在此處詢問的Spliterator特性,這些取決於Stream的來源 因為也有(例如, Collectors CONCURRENTUNORDEREDIDENTITY_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報告IMMUTABLEConcurrentHashMap報告NONNULL )。

另一方面,這些標志可能會在將來使用-如果您知道某個源不能包含null元素( NONNULL ),則顯然可以跳過某些null檢查或使用null定義某些狀態 我想不出任何CONCURRENTIMMUTABLE示例,但是可能有這樣的示例。

例如,在當前實現下,用於UNORDEREDCONCURRENT收集器(!= 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特征,則該拆分器將另外具有SIZEDSUBSIZED特征:

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

SIZEDSUBSIZED器並行SUBSIZED程度較差,因此在編寫自己的並發集合時,最好編寫自定義拆分器,而不依賴於默認的拆分器實現。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM