簡體   English   中英

如何保持流中元素的順序

[英]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.

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