Java8 Stream的元素執行順序問題

2021-09-11 05:49:36 字數 1865 閱讀 7732

管道按什麼順序處理流中的元素,取決於流的串並行、流的資料來源、以及中間操作。

摘自官網的典型示例如下,用foreach方法列印乙個arraylist例項的元素的幾種情況:

integer intarray = ;

listlistofintegers =

new arraylist<>(arrays.aslist(intarray));

system.out.println("listofintegers:");

listofintegers

.stream()

.foreach(e -> system.out.print(e + " "));

system.out.println("");

system.out.println("listofintegers sorted in reverse order:");

comparatornormal = integer::compare;

comparatorreversed = normal.reversed();

collections.sort(listofintegers, reversed);

listofintegers

.stream()

.foreach(e -> system.out.print(e + " "));

system.out.println("");

system.out.println("parallel stream");

listofintegers

.parallelstream()

.foreach(e -> system.out.print(e + " "));

system.out.println("");

system.out.println("another parallel stream:");

listofintegers

.parallelstream()

.foreach(e -> system.out.print(e + " "));

system.out.println("");

system.out.println("with foreachordered:");

listofintegers

.parallelstream()

.foreachordered(e -> system.out.print(e + " "));

system.out.println("");

執行結果:

listofintegers:

1 2 3 4 5 6 7 8

listofintegers sorted in reverse order:

8 7 6 5 4 3 2 1

parallel stream:

3 4 1 6 2 5 7 8

another parallel stream:

6 3 1 5 7 8 4 2

with foreachordered:

8 7 6 5 4 3 2 1

流的元素的執行順序,取決於流的串並行、流的資料來源、以及中間操作:

1、資料來源:如果資料來源本身是無序的,那麼討論元素的執行順序就沒有意義;

2、對於序列的流,其資料來源是有序的,如果中間操作中沒有排序之類的影響順序的操作,那麼在最終操作中處理元素的順序,和資料來源中元素的順序就是一致的;如果中間操作中有排序之類的操作,那麼在最終操作中處理元素的順序,和依次執行各個中間操作之後的元素順序,是一致的。

3、對於並行的流,其資料來源是有序的,但是其最終操作中處理元素的順序依然是隨機的;但是並行流可以通過foreachordered保證執行順序和資料來源中元素的順序一致。

Java8 Stream經典示例

示例一 class user public int getid public string tostring 現在有乙個list的集合,如何把這個list轉換成map其中,key是user id,value是user物件 如下 listusers arrays.aslist new user 1,t...

Java8 Stream 中間操作

1 filter 過濾,接收lambda,從流中排除某些元素 內部迭代 迭代操作有stream api完成 test public void test1 終止操作 一次性執行全部內容 stream.foreach system.out println 外部迭代 test public void te...

java8 stream的collect 三個引數

collect方法有兩個過載 第乙個接收的是collector型別的,可以直接用collectors這類工具傳方法引用。第二個接收的是三個引數的,supplier 乙個能創造目標型別例項的方法。accumulator 乙個將當元素新增到目標中的方法。combiner 乙個將中間狀態的多個結果整合到一...