1. 篩選张弛、切片和映射
1.1 篩選
- 用謂詞篩選--filter
- 去重--distinct(根據(jù)流所生成元素的hashCode和equals方法)
1.2 流的切片
- 什么叫切片:選擇或跳過或截短流中的某些元素
1.2.1 使用謂詞(java 9
-
takeWhile:發(fā)現(xiàn)第一個(gè)不滿足條件的元素就停止
List<Dish> result = lists.Stream.takeWhile(dish ->dish.getCalories < 320 ).collect(toList)缤骨;
- dropWhile:丟棄所有謂語結(jié)果為false的元素,一旦遇到為true的情況就停止并返回剩余所有元素
1.2.2 截短
- limit(n):返回另一個(gè)不超過n的流
1.2.3 跳過
- skip(n):返回一個(gè)扔掉前n個(gè)元素的流
1.3 映射
1.3.1 對流中每個(gè)元素應(yīng)用函數(shù)
- map接受一個(gè)函數(shù),把元素映射成一個(gè)新的元素
- 注意:是創(chuàng)建一個(gè)新副本,而不是修改
1.3.2 扁平化
- 將多個(gè)流合并為一個(gè)流
2. 查找、匹配和歸約
2.1 匹配
- anyMatch :返回Boolean绩卤,因此是一個(gè)終端操作。 檢查謂詞是否至少匹配一個(gè)元素
- allMatch:匹配所有
-
noneMatch
以上幾個(gè)都使用短路操作
2.2 查找
- findAny:返回當(dāng)前流中任意元素
- findFirst:返回第一個(gè)
2.3 歸約
2.3.1 什么是歸約
流中所有元素反復(fù)結(jié)合起來江醇,得到一個(gè)值濒憋。比如你把流中的1、2陶夜、3凛驮、4疊加得到的值的操作就是歸約
- reduce:接受兩個(gè)參數(shù):一個(gè)初始值,一個(gè)BinaryOperator<T>來將兩個(gè)元素結(jié)合產(chǎn)生一個(gè)新值
- 無初始值時(shí)条辟,返回一個(gè)Option對象
3. 使用數(shù)值范圍等數(shù)據(jù)流
3.1 原始類型流特化:避免裝箱成本
- IntStream黔夭、DoubleStream、LongStream
- 將流轉(zhuǎn)化為特定版本
lists.Stream().mapToInt()....
- 轉(zhuǎn)回對象流
intStram.boxed()
- OptionalInt--針對IntStream的返回值存不存在
3.2 數(shù)值范圍流
- IntStream和LongStream的range和rangeClosed方法羽嫡,用來生成數(shù)值范圍流本姥。第一個(gè)參數(shù)接收起始值,第二個(gè)接收結(jié)束值杭棵,rang不包含結(jié)束值婚惫,rangeClosed包含結(jié)束值
4.從多個(gè)源創(chuàng)建流
4.1 從值創(chuàng)建流
- Stream.of(值)
- Stream.empty()創(chuàng)建空流
4.2 從可空對象創(chuàng)建流(java9
- Stream.ofNullable()
4.3 從數(shù)組創(chuàng)建流
- Arrays.stream(數(shù)組)
4.4 從文件創(chuàng)建流
- Files.lins()
- Stream接口通過實(shí)現(xiàn)AutoCloseable接口,解決之前使用I/O資源必須用finally關(guān)閉的問題,Stream會(huì)自己關(guān)閉
5. 無限流
- 函數(shù)生成無限流
- Stream.iterate
- Stream.gengrate