1. 筛选、切片和映射
1.1 筛选
- 用谓词筛选--filter
- 去重--distinct(根据流所生成元素的hashCode和equals方法)
1.2 流的切片
- 什么叫切片:选择或跳过或截短流中的某些元素
1.2.1 使用谓词(java 9
-
takeWhile:发现第一个不满足条件的元素就停止
List<Dish> result = lists.Stream.takeWhile(dish ->dish.getCalories < 320 ).collect(toList); - dropWhile:丢弃所有谓语结果为false的元素,一旦遇到为true的情况就停止并返回剩余所有元素
1.2.2 截短
- limit(n):返回另一个不超过n的流
1.2.3 跳过
- skip(n):返回一个扔掉前n个元素的流
1.3 映射
1.3.1 对流中每个元素应用函数
- map接受一个函数,把元素映射成一个新的元素
- 注意:是创建一个新副本,而不是修改
1.3.2 扁平化
- 将多个流合并为一个流
2. 查找、匹配和归约
2.1 匹配
- anyMatch :返回Boolean,因此是一个终端操作。 检查谓词是否至少匹配一个元素
- allMatch:匹配所有
-
noneMatch
以上几个都使用短路操作
2.2 查找
- findAny:返回当前流中任意元素
- findFirst:返回第一个
2.3 归约
2.3.1 什么是归约
流中所有元素反复结合起来,得到一个值。比如你把流中的1、2、3、4叠加得到的值的操作就是归约
- reduce:接受两个参数:一个初始值,一个BinaryOperator<T>来将两个元素结合产生一个新值
- 无初始值时,返回一个Option对象
3. 使用数值范围等数据流
3.1 原始类型流特化:避免装箱成本
- IntStream、DoubleStream、LongStream
- 将流转化为特定版本
lists.Stream().mapToInt()....
- 转回对象流
intStram.boxed()
- OptionalInt--针对IntStream的返回值存不存在
3.2 数值范围流
- IntStream和LongStream的range和rangeClosed方法,用来生成数值范围流。第一个参数接收起始值,第二个接收结束值,rang不包含结束值,rangeClosed包含结束值
4.从多个源创建流
4.1 从值创建流
- Stream.of(值)
- Stream.empty()创建空流
4.2 从可空对象创建流(java9
- Stream.ofNullable()
4.3 从数组创建流
- Arrays.stream(数组)
4.4 从文件创建流
- Files.lins()
- Stream接口通过实现AutoCloseable接口,解决之前使用I/O资源必须用finally关闭的问题,Stream会自己关闭
5. 无限流
- 函数生成无限流
- Stream.iterate
- Stream.gengrate