学习stream流
宋红康stream流笔记
stream流概述
把真正的函数式编程引入java中。
使用Stream API操作集合中的数据,就像使用sql执行数据库查询。
collection是静态的内存数据结构,面向内存;stream是有关计算的,面向cpu。
对非关系型数据库数据的过滤,先查到程序里,利用streamAPI实现过滤。
执行流程
- 步骤一:Stream的实例化
- 步骤二:一系列中间操作
- 步骤三:执行终止操作
步骤1:实例化
通过集合调用stream方法:
通过数组Arrays工具类获取:
通过Stream的of方法,接收可变参数:
步骤2:中间操作
中间操作可以链式调用。层层处理。
(1)筛选与切片
快捷键:ctrl + p 查看参数提示
断定型函数式接口,可以用Lambda表达式
延迟执行:若没有编写终止操作,则中间操作不会真正执行。
添加上终止操作forEach:
截断流 limit
使元素不超过给定数量。
注意获取的stream是一次性的,一旦执行过终止操作,就失效了。
跳过元素 skip(n)
跳过前n个元素,若跳过元素大于实际元素个数,则无输出,不会越界。
筛选,去重 distinct()
参照hashCode() 和 equals() 方法去重,所以自定义类必须要重写方法才能实现去重。
(2)映射操作
map(),接收一个函数式接口对象,定义函数操作
(3)排序
注意:stream流不改变源数据,而是返回新的stream。
使用定制排序,传入函数式接口对象comparator
要想逆序排序,可以给compareTo加负号
终止操作
匹配与查找
allMatch:是否所有都匹配,返回bool值
anyMatch:是否至少有一个匹配
findFirst:返回第一个元素
对于返回结果可能为空的,被封装到option中
调用get()可以获得里面的内容
count:返回流中元素的总个数
注意:max和min方法返回的是比较器认为的最大、最小值
这意味着降序排列,max会返回自然顺序的最小值
max(Comparator c):返回流中元素的最大值,结果在Optional中
min(Comparator c):返回流中元素的最小值,结果在optional中
forEach(Consumer c):内部迭代
归约
reduce(T identity,BinaryOperator):将流中的元素按照BinaryOperator指定的规则结合起来,得到一个值,返回值为T,identity提供一个初值,由于给了初始值,结果不会为空,所以没有封装入optional
binaryOperator继承自BiFunction<T,T,T>,两个自变量一个因变量的类型相同
BiFuntion接口的方法为apply
reduce(BinaryOperator):将流中的元素按照BinaryOperator指定的规则结合起来,得到一个值,返回值为T,由于没有identity提供一个初值,结果可能为空,所以封装入optional
收集
由于stream流不会改动源数据,为了保存下中间过程的更改,提供了收集方法。
collect(Collector c):将流转换位其他形式,接收一个Collector接口的实现,用于给Stream中元素作汇总的方法
可以传入Collectors.toXxx方法