Java8 Stream終端操作使用詳解

前情回顧

前幾篇講了Java8中Stream流的簡介,創(chuàng)建流的方式,以及Stream流中間操作的使用詳解,想回顧的可以戳:

話不多說,自己挖的坑自己要填完,今天就給大家講完Java8中Stream的終端操作使用詳解。Stream流的終端操作主要有以下幾種,我們來一一講解。

  • forEach()

  • forEachOrdered()

  • toArray()

  • reduce()

  • collect()

  • min()

  • max()

  • count()

  • anyMatch()

  • allMatch()

  • noneMatch()

  • findFirst()

  • findAny()

終端操作代碼實(shí)例詳解

1、forEach():遍歷流中的每一個元素,按照指定的方法執(zhí)行,執(zhí)行順序不一定按照流的順序。

// foreach:遍歷流中每一個元素,執(zhí)行順序按照流的順序

運(yùn)行結(jié)果:

1

2

3

4

5

6

2

1

6

5

3

4

2、forEachOrdered():遍歷流中的每一個元素,按照指定的方法執(zhí)行,執(zhí)行順序按照流的順序。

// forEachOrdered():遍歷流中每一個元素,執(zhí)行順序按照流的順序

運(yùn)行結(jié)果:

1

2

3

4

5

6

1

2

3

4

5

6

3、toArray():將流中的元素放入到一個數(shù)組中

// toArray():將流中的元素放入到一個數(shù)組中

運(yùn)行結(jié)果:[ma, zhi, chu]

4、reduce():這個方法的主要作用是把 Stream 元素組合起來。它提供一個起始值(種子),然后依照運(yùn)算規(guī)則(BinaryOperator),和前面 Stream 的第一個、第二個、第 n 個元素組合。從這個意義上說,字符串拼接、數(shù)值的 sum、min、max、average 都是特殊的 reduce。

// reduce():字符串拼接

運(yùn)行結(jié)果:

mazhichu

mazhichu

10

10

10

-6.6

5、collect():是Stream的一個函數(shù),負(fù)責(zé)收集流。前面我們說中間操作是將一個流轉(zhuǎn)換成另一個流,這些操作是不消耗流的,但是終端操作會消耗流,產(chǎn)生一個最終結(jié)果,collect()就是一個規(guī)約操作,將流中的結(jié)果匯總。結(jié)果是由傳入collect()中的Collector定義的。

// collect():負(fù)責(zé)收集流,將結(jié)果匯總,比如將下面的流中的結(jié)果匯總到一個集合中去

運(yùn)行結(jié)果:[91, 92, 93, 94, 95, 96, 97, 98, 99]

6、min():返回流中的最小值

// min():返回流中的最小值

運(yùn)行結(jié)果:

1

1

7、max():返回流中的最大值

// max():返回流中的最大值

運(yùn)行結(jié)果:

6

6

8、count():返回流中元素的數(shù)量

// count():返回流中元素的數(shù)量

運(yùn)行結(jié)果:

5

3

9、anyMatch():Stream 中只要有一個元素符合傳入的斷言,就返回 true,否則返回false。

// anyMatch():判斷流中數(shù)據(jù)是否有一個復(fù)合斷言

運(yùn)行結(jié)果:

true

false

false

10、allMatch():Stream 中所有元素都符合傳入的斷言時返回 true,否則返回false,流為空時總是返回true。

// allMatch():判斷流中元素是否都符合斷言條件

運(yùn)行結(jié)果:

true

false

true

11、noneMatch():Stream 中所有元素都不滿足傳入的斷言時返回 true,否則返回false。

 // noneMatch():判斷流中元素是否都不符合傳入的斷言條件

運(yùn)行結(jié)果:

true

false

true

12、findFirst():總是返回流中的第一個元素,如果流為空,返回一個空的Optional.

// findFirst():返回流中的第一個元素

運(yùn)行結(jié)果:

Optional[1]

true

1

Optional.empty

false

13、findAny():返回流中的任意一個元素即可,如果流為空,返回一個空的Optional.

// findAny():返回流中任意一個元素,

運(yùn)行結(jié)果:

Optional[1]

true

1

Optional.empty

false

以上就是Stream的13個終端操作,流的操作是以管道的方式串起來的。流管道包含一個數(shù)據(jù)源,接著包含零到N個中間操作,最后以一個終端操作結(jié)束。下面我們來總結(jié)一下Stream流。

Stream有以下特性及優(yōu)點(diǎn)

  • 無存儲。Stream不是一種數(shù)據(jù)結(jié)構(gòu),它只是某種數(shù)據(jù)源的一個視圖,數(shù)據(jù)源可以是一個數(shù)組,Java容器或I/O channel等。

  • 為函數(shù)式編程而生。對Stream的任何修改都不會修改背后的數(shù)據(jù)源,比如對Stream執(zhí)行過濾操作并不會刪除被過濾的元素,而是會產(chǎn)生一個不包含被過濾元素的新Stream。

  • 惰式執(zhí)行。Stream上的操作并不會立即執(zhí)行,只有等到用戶真正需要結(jié)果的時候才會執(zhí)行。

  • 可消費(fèi)性。Stream只能被“消費(fèi)”一次,一旦遍歷過就會失效,就像容器的迭代器那樣,想要再次遍歷必須重新生成。

  • 對于無限數(shù)量的流,有些操作是可以在有限的時間完成的,比如limit(n) 或 findFirst(),這些操作可是實(shí)現(xiàn)"短路"(Short-circuiting),訪問到有限的元素后就可以返回。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容