Stream流--java进阶day12
1.Stream流
Stream流相当于流水线,把数据放到流水线上进行一系列的加工和处理,最后再放出数据
2.获取流对象
[1]集合获取Stream流对象
Collection集合中存在一个默认方法--stream,单列集合可以直接调用该方法获取流对象
Stream流可以使用链式编程,省略中间变量,获取到流对象后可以直接遍历打印(forEach形参是Cosumer接口,要给实现类对象)
注意: 双列集合不能直接调用stream方法,需要间接获取流对象
如图,使用entrySet获取到键值对对象,set集合是单列集合,可以直接使用stream获取流对象
[2]数组获取流对象
通过Arrays工具类中的stream方法,将数组封装成流对象
数组封装成流对象,返回值类型是intStream、doubleStream,但是这些返回值类型和Stream都继承了BaseStream,属于兄弟关系,无影响
[3]零散数据获取流对象
零散的数据就是没有装入集合或者数组的数据,通过Stream接口的of方法使用可变参数接收零散数据
基础的写法:带有中间变量
简化后
3.中间方法
1.filter:过滤流水线上的数据
filter形参要给实现类对象,重写后的方法返回值是boolean,用于判断数据是否保留,true则保留,false则删去
可用Lambda简化
2.limit:获取前几个元素
以括号里的数字为标准,获取前几位元素
3.skip:跳过前几个元素
以括号里的数字为标准,跳过前几位元素
4.concat:将两个流合并成一个流
使用Stream类调用concat,将两个流合并成一个流。合成后的变量已经是流,无须再获取流对象,直接遍历打印即可
5.distinct:去除流中重复的元素
直接调用distinct即可去除流中重复的元素(自定义变量需要重写equals和hashcode)
4.注意事项
forEach方法属于终结方法,当使用了终结方法后,相当于流水线的数据已经出线,无法回退到流水线,![]()
也就无法继续使用forEach遍历打印,需求3使用了终结方法,所以需求4再使用会报错
5.终结方法
这两个方法返回的类型不再是stream,也就无法继续链式编程
1.count:返回流中元素个数
6.Stream收集操作
无论我们在流中间如何操作,都不会影响数据源,如果我们想要得到经过流操作后的数据,就需要使用收集操作
[1]collect:将流中的数据收集到集合
collect方法形参是接口,需要匿名内部类,但是我们不需要自己写,java帮我们写好了--Collectors工具类
我们只需拿着Collectors点里面的方法即可
1.toList
如下图,将流操作后的数据收集到了List集合
..
2.toSet
Set集合还是会帮我们进行去重
..