來源的無序性或通過unordered()
顯式釋放訂單合約可能會影響後續的所有管道階段,除非它們引入的訂單隻能在sorted
操作中發生。
對於像filter
和map
無國籍中間業務,是沒有區別的,無論如何,但像skip
,limit
和distinct
操作可能會根據先前的流狀態是否有序或無序表現出不同的行爲。 This answer顯示distinct
如何受之前的unordered()
影響。
請注意,原則上,sorted
在引入順序時可能取決於前一階段的有序狀態,因爲如果前一個流是無序的,它可能會使用不穩定的排序算法。
This answer提供了一種方法來打印流的特徵並評估它們因附加其他操作而發生的變化。
當您鏈接終端操作時,終端操作本身的無序性質或終端操作之前的最後一個階段的無序狀態可能足以爲不嘗試終端操作的終端操作選擇算法保持秩序。
原則上,終端操作的無序性質可以用來影響之前的階段,但因爲無狀態的中間業務是無論如何也受到影響,skip
,limit
,distinct
必須遵守先前的有序狀態,如果存在的話,唯一的可能會受到影響的操作是sorted
,如果後續操作無論如何不關心訂單,該操作就會過時。
在當前實現中,自Java 8更新60以來,終端操作的無序性不會影響以前階段的行爲。與之前的實施方式一樣,進行了此更改,它錯誤地影響了skip
和limit
。放棄過時的分揀步驟的機會並不被認爲是一個問題,因爲鏈接sort
與無序的後續操作,是一個角落的情況。如果您想了解更多關於相關討論的信息,請參閱this answer,包括評論。
所以對於
list.stream() // List.stream() returns an ordered stream
.unordered() // releases order contract
.distinct() // for equal elements, it may pick an arbitrary one
.sorted() // re-introduces an order
.skip(1) // will skip the minimum element due to the order
.forEach(System.out::println); // may print the remaining elements in arbitrary order
沒有一個單一的有序或無序行爲流管道。
相比之下,
hashSet.stream() // HashSet.stream() has no order (unless being a LinkedHashSet)
.filter(Objects::nonNull) // not affected by order
.distinct() // may use unorderedness, but has no effect anyway, as already distinct
.skip(1) // may skip an arbitrary element
.forEachOrdered(System.out::println); // would respect order if there was one
整個管道運行無序的,只是因爲源是無序的。有了一個有序的來源,它將完全有序。
因此,對「」的回答是評估整個流水線ORDER特徵,即使在執行開始之前通過源,中間操作和終端操作的特徵來完成?「是的,是的,這是在開始實際處理之前完成的,通過爲流水線階段選擇適當的算法,當有選擇時,但是該處理不一定導致整個流水線的單個特性。
很好的答案,比它深得多:) –
@Holger非常thnx人 – nantitv