前情回顧
前幾篇講了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),訪問到有限的元素后就可以返回。