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集合还是会帮我们进行去重

..

3.toMap

toMap形参有两个,而且都是接口,要给实现类对象,分别对应键和值

以案例为例,讲解toMap使用

解答如下,遍历打印仅用于检测

接下来将过滤好的数据收集到Map集合,toMap括号先写一个“,” 减少报错

接着,先写键的实现类,Function第一个泛型是系统检测到我们的键是字符串类型,第二个泛型则是询问我们要给键什么类型

姓名肯定是字符串类型,所以第二个泛型写String,重写方法,将姓名返回到集合中

然后,同样的套路,写值的实现类,年龄肯定是整数,所以给Integer

最后.var 将数据收集到Map集合

posted @ 2025-04-06 15:38  直実  阅读(40)  评论(0)    收藏  举报