java 8 Stream 中 peek 的用法和注意点

前言:

java 8 Stream中操作类型,stream作为流式操作有两种操作类型,中间操作和终止操作。

中间操作和终止操作的区别:

一个java 8的stream是由三部分组成的。

  • 数据源,
  • 零个或一个或多个中间操作,
  • 一个或零个终止操作。

中间操作是对数据的加工,

  • 注意,中间操作是lazy操作,并不会立马启动,需要等待终止操作才会执行。

终止操作是stream的启动操作,

  • 只有加上终止操作,stream才会真正的开始执行。

peek是一个中间操作:

java 对它的定义:

在这里插入图片描述

翻译过来的意思是:

返回由该流的元素组成的流,并在从结果流中消耗元素时对每个元素执行提供的操作。

这是一个中间操作。

对于并行流管道,可以在上游操作提供元素的任何时间和任何线程中调用该操作。如果操作修改了共享状态,则它负责提供所需的同步。

参数:操作 - 在从流中消耗元素时对元素执行的非干扰操作

返回:新流 API

说明:此方法主要用于支持调试,您希望在元素流过管道中的某个点时查看它们:

需要注意的点:

  1. peek 是一个中间操作,懒加载,如果执行完peek 没有执行终止操作,peek 的操作是不会执行。
  2. peek 加上终止操作,只能改变对象的值,不能改变基本类型的值。

证明一:peek懒加载,没有执行终止操作,peek 的操作是不会执行.

代码:

List<Integer> sysList = Lists.newArrayList();
sysList.add(1);sysList.add(2);sysList.add(3);
System.out.println("不添加终止操作:collect,结果:");
sysList.stream().peek(s-> System.out.println(s));
System.out.println("--------------------");
System.out.println("添加终止操作:collect");
sysList.stream().peek(s-> System.out.println(s)).collect(Collectors.toList());

结果:

在这里插入图片描述

分析:

可以看到,不添加终止操作,peek 中的System.out.println没有执行;
添加终止操作(collect),peek 中的System.out.println执行。

证明二:基本操作类型不会被修改:

代码:

List<Integer> sysList = Lists.newArrayList(); 

sysList.add(1);
sysList.add(2);
sysList.add(3); 
System.out.println("修改前"); 
for (Integer a:sysList) { System.out.println(a); } 
System.out.println("--------------------"); 
sysList.stream().peek(a->a+=1).collect(Collectors.toList()); 
System.out.println("修改后"); 
for (Integer a:sysList) { System.out.println(a); }

执行结果:
在这里插入图片描述

分析:

由基本类型组成的数组sysList 经过peek 和collect 操作后,没有保存修改的值。

证明三:对象组成的数组会修改:

代码:

   //1. 定义对象数组
  List<SysPost> sysPostList = new ArrayList<>();
  SysPost sysPost = new SysPost();
  sysPost.setPostId(1l);
  sysPost.setStatus("peek");
  sysPostList.add(sysPost);
  SysPost sysPost1 = new SysPost();
  sysPost1.setPostId(2l);
  sysPost1.setStatus("peek1");
  sysPostList.add(sysPost1);
  //2. 打印原始值
  System.out.println("修改前");
  for (SysPost sysPost2:sysPostList) {
      System.out.println(JSONObject.toJSONString(sysPost2));
  }
  //3. 修改,对象属性:Status 拼接0,PostId加1
  sysPostList.stream().peek(s->{
      s.setStatus(s.getStatus()+"0");
      s.setPostId(s.getPostId()+1);
  }).collect(Collectors.toList());
  System.out.println("--------------------");
  //4. 打印修改后的值
  System.out.println("修改后");
  for (SysPost sysPost2:sysPostList) {
      System.out.println(JSONObject.toJSONString(sysPost2));
  }

结果:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值