由於我使用流很多,其中一些處理大量的數據,我認爲這是一個好主意,預先分配我的基於集合的收集器的大小,以防止昂貴的重新分配,因爲集合增長。所以,我想出了這個,對於其他集合類型相似的:儘可能在收集器中使用Characteristics.UNORDERED很重要嗎?
public static <T> Collector<T, ?, Set<T>> toSetSized(int initialCapacity) {
return Collectors.toCollection(()-> new HashSet<>(initialCapacity));
}
像這樣來使用
Set<Foo> fooSet = myFooStream.collect(toSetSized(100000));
我擔心的是,Collectors.toSet()
實施設置一個Characteristics
的枚舉Collectors.toCollection()
不會:Characteristics.UNORDERED
。 Collectors.toCollection()
沒有方便的變化來設置超出默認值的所需特性,並且由於可見性問題,我無法複製Collectors.toSet()
的實現。因此,設置UNORDERED
特徵我被迫做這樣的事情:
static<T> Collector<T,?,Set<T>> toSetSized(int initialCapacity){
return Collector.of(
() -> new HashSet<>(initialCapacity),
Set::add,
(c1, c2) -> {
c1.addAll(c2);
return c1;
},
new Collector.Characteristics[]{IDENTITY_FINISH, UNORDERED});
}
因此,這裏是我的問題:1。 這是我爲作爲自定義簡單的事情創建一個無序收集唯一選擇toSet()
2.如果我想讓它理想地工作,是否需要應用無序特性?我讀過a question on this forum,在那裏我瞭解到無序特性不再反向傳播到Stream中。它仍然有用嗎?
但是'HashSet'是無序的(所以它是一個集合的定義)。所以你的代碼片段應該仍然有任意的順序。或者我在這裏錯過了什麼? – Obicere
這是個好問題,@Obicere。很顯然,它是一個無序集合的事實並不爲api所知,所以'特性'枚舉在收集器中用於提供額外的提示。查看'Collectors.toSet()'的源代碼。它還使用'HashSet',並故意將'UNORDERED'特性設置爲'Stream'或上游'Collector'的調用提示。 –
ahh gotcha。只是看用法,似乎是必要的[在一些地方](http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/8u40-b25/java/util/stream /ReduceOps.java#185)。所以看起來2號的答案真的取決於你是否想要小的優化選項。 – Obicere