簡體   English   中英

Java流的處理順序

[英]Java stream order of processing

我有以下內容:

LinkedList<Integer> ints = new LinkedList();
//fill it with some ints
Stream<Integer> stream = ints.stream();
//process the stream in some way

我的問題是,是否可以保證流的處理順序與基礎LinkedList 我閱讀了文檔,但沒有有關訂購的任何信息。

就我而言,至關重要的是保留訂單。

文檔中

流可能具有也可能沒有定義的遇到順序。 流是否具有遇到順序取決於源和中間操作。 某些流源(例如List或數組)是固有排序的,而其他流源(例如HashSet)則不是。 某些中間操作(例如sorted())可能會在其他情況下將無序流強加一個遇到順序,而其他一些操作可能會使有序流變得無序,例如BaseStream.unordered()。 此外,某些終端操作可能會忽略遇到順序,例如forEach()。

如果對流進行了排序,則大多數操作將被約束為按其遇到順序對元素進行操作; 如果流的源是包含[1、2、3]的列表,則執行map(x-> x * 2)的結果必須為[2、4、6]。 但是,如果源沒有定義的遇到順序,則值[2、4、6]的任何排列都是有效的結果。

對於順序流,是否存在相遇順序不會影響性能,只會影響確定性。 如果訂購了一個流,則在相同的源上重復執行相同的流管道將產生相同的結果; 如果未訂購,重復執行可能會產生不同的結果。

對於並行流,放寬排序約束有時可以提高執行效率。

另外,正如您提到的,處理訂單很重要,請參見此處

如果流操作的行為參數是有狀態的,則流管道結果可能不確定或不正確。

最好的方法是避免使用有狀態的行為參數來完全流式處理操作。 通常有一種方法可以重組流管道以避免狀態化。

另請參見以下問題的答案: 如何確保java8流中的處理順序?

簡而言之,如果您使用順序流(在一個線程中執行的流)並且對諸如forEach()類的操作很謹慎,則看起來可以保留順序。 但是,這可能不是一個好主意。

取決於要應用於流的處理...尤其是使用parallel()

import java.util.LinkedList;
import java.util.function.Consumer;
import java.util.stream.Stream;

public class Streaming {

    public static void main(String[] args) {
        LinkedList<Integer> ints = new LinkedList();
        for(int i = 0 ; i < 100; i++) {
            ints.add(i);
        }
        Stream<Integer> stream = ints.stream();
        // will not be ordered
        stream.parallel().forEach(new Consumer<Integer>() {

            @Override
            public void accept(Integer t) {
                System.out.println(t);
            }

        });

        stream = ints.stream();
        // will be ordered
        stream.parallel().forEachOrdered(new Consumer<Integer>() {

            @Override
            public void accept(Integer t) {
                System.out.println(t);
            }

        });
    }
}

暫無
暫無

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

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