一、前言
最近在项目开发过程中,发现 Stream流的peek方法也可以遍历元素,平时开发过程中,遇到要遍历集合中的元素,都是 foreach 方法遍历,突然出现一个peek也可以遍历,好奇心驱使,要搞清楚:Stream的 peek 和 foreach 方法区别 。
常见的 list集合元素遍历方法:
list.forEach();
list.stream().forEach();
for (Integer integer : list) {
}
二、代码理解
1、有一个 list 集合,有5个元素,分别是: [1,2,3,4,5]
ArrayList<Integer> list = Lists.newArrayList(1,2,3,4,5);
2、使用 forEach 遍历
@Test
public void forEachTest(){
list.stream().forEach(System.out::println);
System.out.println("forEachTest 执行完毕");
}
2.1、输出结果如下:
1
2
3
4
5
forEachTest 执行完毕
3、使用 peek 遍历
@Test
public void peekTest(){
list.stream().peek(System.out::println);
System.out.println("peekTest 执行完毕");
}
3.1、输出结果如下:
peekTest 执行完毕
4、使用 peek 遍历2 --- 注意: 有 count 方法 终止流。
@Test
public void peekTest2(){
list.stream().peek(System.out::println).count();
System.out.println("peekTest2 执行完毕");
}
4.1、输出结果如下:
1
2
3
4
5
peekTest2 执行完毕
三、总结
1、根据 【2.1】的结果可以看到: forEach方法会正常执行。
2、根据【3.1】的结果可以看到: peek方法没有执行。
3、分别查看 forEach 和 peek 方法签名, 可知:foreach 属于终止方法,而peek属于中间方法 。
//forEach
void forEach(Consumer<? super T> action);
// peek
Stream<T> peek(Consumer<? super T> action);
4、结合【4.1】的结果可知:foreach可以直接执行,而peek独自调用时并没有被执行,但peek后面加上终止操作之后便可以被执行。
5、本人理解的 peek方法应用,类似于一个 观察者的 角色,不能改变集合中的元素,必须有终止流才会执行,比如下面这个:
/**
* @Description: peek 方法应用
* <br> 观察 filter , map 方法处理后的最终结果
* @return void
* @version v1.0
* @author wu
* @date 2022/8/13 23:13
*/
@Test
public void peekTest3(){
List<Integer> collect = list.stream().filter(e -> e > 3)
.map(e -> e * 2)
.peek(System.out::println)
.collect(Collectors.toList());
System.out.println("collect result : " +collect);
System.out.println("peekTest3 执行完毕");
}
5.1 输出结果:
8
10
collect result : [8, 10]
peekTest3 执行完毕
了解更多:Java8的 lambda Stream的 map 和 flatmap 方法区别 map和flatMap方法的用法_HaHa_Sir的博客-CSDN博客