Stream 特点
- stream 本身不会存储元素
- stream 不会改变源对象。 相反,会返回一个持有结果的新对象
- stream 操作时延时执行的,意思是stream对象只有在调用终止操作时,才会执行一系列中间操作。否则中间操作不执行
Stream执行流程
- 创建Stream实例
- 通过集合创建
- 通过数组创建:Arrays.stream()
- 通过Stream的of方法
- 通过Stream的iterate方法或者generate方法,创建无限流
Stream.iterate(0, seed -> seed + 2).limit(10).forEach(System.out::println);
Stream.generate(Math::random).limit(10).forEach(System.out::println);
- 执行一系列中间操作
- 筛选和切片
filter: 从流中排除某些元素
limit:使其元素不超过给定的数量
skip:跳过指定数量的元素,如果流中元素的数量少于指定指定数量则返回一个空流(不是null,是流中一个元素都没有)
distinct: 通过元素的hashcode和equals方法去除流中重复元素
- 映射
map: 将每个元素作用在map上
flatmap: 将流中每个值转换成另外一个流,然后把所有流连成一个流
- 排序
sorted: 默认自然排序,也可以执行排序规则
- 执行终止操作
- 匹配与查找
allMatch: 检查规则是否匹配所有元素,返回布尔值
anyMatch:检查规则是否匹配任意元素,返回布尔值
noneMatch:检查规则没有匹配的元素,返回布尔值
findFirst: 返回第一个元素
findAny:返回当前流中任意元素
count:返回流中的元素个数
max:返回流中最大值
min:返回流中最小值
forEach:内部迭代
- 归约
reduce: 将流中的值反复结合起来,得到一个值,如求和操作
- 收集
collect:将流转换为其他形式
- 返回stream操作之后的结果,源对象没有改变