当前位置: 首页 > 工具软件 > Peek > 使用案例 >

Java8的 lambda Stream的 peek 和 foreach 方法区别 peek和foreach用法

彭朝
2023-12-01

      Java8的 lambda  Stream的 peek 和 foreach 方法区别 peek和foreach用法

一、前言

        最近在项目开发过程中,发现 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博客

 类似资料: