前言:
java 8 Stream中操作类型,stream作为流式操作有两种操作类型,中间操作和终止操作。
中间操作和终止操作的区别:
一个java 8的stream是由三部分组成的。
- 数据源,
- 零个或一个或多个中间操作,
- 一个或零个终止操作。
中间操作是对数据的加工,
- 注意,中间操作是lazy操作,并不会立马启动,需要等待终止操作才会执行。
终止操作是stream的启动操作,
- 只有加上终止操作,stream才会真正的开始执行。
peek是一个中间操作:
java 对它的定义:
翻译过来的意思是:
返回由该流的元素组成的流,并在从结果流中消耗元素时对每个元素执行提供的操作。
这是一个中间操作。
对于并行流管道,可以在上游操作提供元素的任何时间和任何线程中调用该操作。如果操作修改了共享状态,则它负责提供所需的同步。
参数:操作 - 在从流中消耗元素时对元素执行的非干扰操作
返回:新流 API
说明:此方法主要用于支持调试,您希望在元素流过管道中的某个点时查看它们:
需要注意的点:
- peek 是一个中间操作,懒加载,如果执行完peek 没有执行终止操作,peek 的操作是不会执行。
- 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));
}
结果: