[英]Java Streams - How to preserve the initial Order of elements while using Collector groupingBy()
[英]How to preserve order of the elements in streams
我想使用以下spliterator()方法保留數組元素的順序。
但是,當我運行此程序時,它將產生4 2 1 3
作為輸出。
public class Test1 {
public static void main(String[] args) {
m1().anyMatch(e -> {
System.out.println(e);
return false;
});
}
private static LongStream m1() {
return StreamSupport.longStream(Arrays.spliterator(new long[] { 1, 2, 3, 4 }), true);
}
}
請檢查並讓我知道這件事是否可行。
您正在請求並行流,因此,您無法獲得已定義的處理順序 ,因為並行處理和有序處理是一個普遍的矛盾。
如果要按順序處理元素,則必須同時執行這兩項操作,請求順序流並使用取決於順序的終端操作:
public static void main(String[] args) {
m1().filter(e -> {
System.out.println(e);
return false;
}).findFirst();
}
private static LongStream m1() {
return StreamSupport.longStream(Arrays.spliterator(new long[] { 1, 2, 3, 4 }), false);
}
但是請注意,您應該避免編寫依賴於處理順序的軟件。 即使最終結果可能取決於遇到的順序 ,也應該以不依賴處理順序的方式定義任務。
例如,如果您寫
public static void main(String[] args) {
m1().filter(e -> {
System.out.println(e);
return e%2 == 0;
})
.findFirst()
.ifPresent(result -> System.out.println("final result: "+result));
}
private static LongStream m1() {
// note that you can have it much simpler:
return LongStream.of(1, 2, 3, 4 ).parallel();
}
中間輸出可以是任意順序,並且無法保證輸出中是否顯示“ 3”和“ 4”,但是您可以保證最后一個輸出將是“最終結果:2”,因為這是遇到順序中的第一個匹配元素。 另請參閱此處 。
好吧,您使用的是anyMatch
,它首先不保留順序,因此,這非常值得期待。 如果要獲取第一個元素,請使用findFirst
例如。
在創建並行流(第二個參數= true
)時, StreamSupport.longStream(Arrays.spliterator(new long[] { 1, 2, 3, 4 }), true)
您不會獲得有序訪問。 如果創建順序流(將第二個參數從true
更改為false
),則應該獲得所需的內容。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.