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


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

    一、前言

            最近在项目开发过程中,发现 Stream流的peek方法也可以遍历元素,平时开发过程中,遇到要遍历集合中的元素,都是 foreach 方法遍历,突然出现一个peek也可以遍历,好奇心驱使,要搞清楚:Stream的 peek 和 foreach 方法区别

            常见的 list集合元素遍历方法:

    1. list.forEach();
    2. list.stream().forEach();
    3. for (Integer integer : list) {
    4. }

    二、代码理解

            1、有一个 list 集合,有5个元素,分别是: [1,2,3,4,5]

    ArrayList list = Lists.newArrayList(1,2,3,4,5);

            2、使用 forEach 遍历

    1. @Test
    2. public void forEachTest(){
    3. list.stream().forEach(System.out::println);
    4. System.out.println("forEachTest 执行完毕");
    5. }

            2.1、输出结果如下:

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. forEachTest 执行完毕

            3、使用 peek 遍历

    1. @Test
    2. public void peekTest(){
    3. list.stream().peek(System.out::println);
    4. System.out.println("peekTest 执行完毕");
    5. }

            3.1、输出结果如下:

    peekTest 执行完毕

            4、使用 peek 遍历2 --- 注意: 有 count 方法 终止流。

    1. @Test
    2. public void peekTest2(){
    3. list.stream().peek(System.out::println).count();
    4. System.out.println("peekTest2 执行完毕");
    5. }

            4.1、输出结果如下:

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. peekTest2 执行完毕

    三、总结

            1、根据 【2.1】的结果可以看到: forEach方法会正常执行。

            2、根据【3.1】的结果可以看到: peek方法没有执行。

            3、分别查看 forEach 和 peek 方法签名, 可知:foreach 属于终止方法,而peek属于中间方法 。

    1. //forEach
    2. void forEach(Consumersuper T> action);
    3. // peek
    4. Stream peek(Consumersuper T> action);

            4、结合【4.1】的结果可知:foreach可以直接执行,而peek独自调用时并没有被执行,但peek后面加上终止操作之后便可以被执行。

            5、本人理解的 peek方法应用,类似于一个 观察者的 角色,不能改变集合中的元素,必须有终止流才会执行,比如下面这个:

    1. /**
    2. * @Description: peek 方法应用
    3. *
      观察 filter , map 方法处理后的最终结果
    4. * @return void
    5. * @version v1.0
    6. * @author wu
    7. * @date 2022/8/13 23:13
    8. */
    9. @Test
    10. public void peekTest3(){
    11. List collect = list.stream().filter(e -> e > 3)
    12. .map(e -> e * 2)
    13. .peek(System.out::println)
    14. .collect(Collectors.toList());
    15. System.out.println("collect result : " +collect);
    16. System.out.println("peekTest3 执行完毕");
    17. }

            5.1 输出结果:

    1. 8
    2. 10
    3. collect result : [8, 10]
    4. peekTest3 执行完毕

  • 相关阅读:
    七月集训(第21天) —— 堆(优先队列)
    Git大型文件存储
    【时间序列预测】Autoformer论文笔记
    苹果iPhone手机iOS16如何取消关闭复制粘贴时不停弹出的剪贴板粘贴提示通知弹窗?
    wordpress的手工迁移
    java计算机毕业设计基于安卓Android/微信小程序的电影交流平台系统APP
    OpenCV视频防抖技术解析
    腾讯云EKS 上部署 eshopondapr
    react实现路由拦截器
    QT4.8显示目录,和windows浏览一致的方法
  • 原文地址:https://blog.csdn.net/HaHa_Sir/article/details/126326318