Java 8 Stream Api 中的 peek 操作
1. 前言
我在Java8 Stream API 详细使用指南 中讲述了 Java 8 Stream API 中 map
操作和 flatMap
操作的区别。然后有小伙伴告诉我 peek
操作 也能实现元素的处理。但是你知道 map
和 peek
的区别吗? map
我们在开头文章已经讲过了,你可以去详细了解一下它,本文将重点讲解一下 peek
操作。
2. peek
peek
操作接收的是一个 Consumer<T>
函数。顾名思义 peek 操作会按照 Consumer<T>
函数提供的逻辑去消费流中的每一个元素,同时有可能改变元素内部的一些属性。 这里我们要提一下这个 Consumer<T>
以理解 什么时消费。
2.1 什么是消费 (Consumer)
package java.util.function; import java.util.Objects; @FunctionalInterface public interface Consumer<T> { void accept(T t); // 嵌套accept , 顺序为先执行 accept 后执行参数里的 after.accpet default Consumer<T> andThen(Consumer<? super T> after) { Objects.requireNonNull(after); return (T t) -> { accept(t); after.accept(t); }; } }
Consumer<T>
是一个函数接口。一个抽象方法 void accept(T t)
意为接受一个 T
类型的参数并将其消费掉。其实消费给我的感觉就是 “用掉” ,自然返回的就是 void
。 通常“用掉” T
的方式为两种:
- T 本身的 void 方法 比较典型的就是
setter
。 - 把 T 交给其它接口(类)的 void 方法进行处理 比如我们经常用的打印一个对象
System.out.println(T)
2.2 peek 操作演示
Stream<String> stream = Stream.of("hello", "felord.cn"); stream.peek(System.out::println);
如果你测试了上面给出的代码你会发现,压根不会按照逻辑跑。这是为啥子呢? 这是因为流的生命周期有三个阶段:
- 起始生成阶段。
- 中间操作会逐一获取元素并进行处理。 可有可无。所有中间操作都是惰性的,因此,流在管道中流动之前,任何操作都不会产生任何影响。
- 终端操作。通常分为 最终的消费 (
foreach
之类的)和 归纳 (collect
)两类。还有重要的一点就是终端操作启动了流在管道中的流动。
所以应该改成下面:
Stream<String> stream = Stream.of("hello", "felord.cn"); List<String> strs= stream.peek(System.out::println).collect(Collectors.toLIst());
比如下图,我们给圆球加了一个框:
3. peek VS map
peek
操作 一般用于不想改变流中元素本身的类型或者只想元素的内部状态时;而 map
则用于改变流中元素本身类型,即从元素中派生出另一种类型的操作。这是他们之间的最大区别。 那么 peek 实际中我们会用于哪些场景呢?比如对 Stream<T>
中的 T
的某些属性进行批处理的时候用 peek
操作就比较合适。 如果我们要从 Stream<T>
中获取 T
的某个属性的集合时用 map
也就最好不过了。
4. 总结
我们今天了解 Stream
的 peek
操作,同时也回顾了 Stream
的生命周期。也顺带对 Consumer<T>
函数进行了讲解。而且 和 map
相互做了比较,对各自的使用场景又做了说明。相信看过本文后你对它们会有更深的理解。
关注公众号:Felordcn获取更多资讯
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
分布式文件系统FastDFS安装部署(高可用)
本文会搭建一个适合低业务访问业务量的高可用的FastDFS集群环境:两个Tracker服务,一个storage group中两个storage服务节点;该方案仅适用于业务访问量较低的环境下。对于大量业务系统的高并发访问,为了保证存储系统正常工作一般的架构思路:安装多个Tracker服务(至少两个,根据业务量调整),搭建多个storage group(至少两个,根据业务量调整),每个storage group中多个storage node(至少两个,做数据的冗余备份,进行容灾机制,而且node必须在不同的机器上) 一、FastDFS简介 FastDFS是一个开源的轻量级分布式文件系统,它对文件进行管理,功能包括:文件存储、文件同步、文件访问(文件上传、文件下载)等,解决了大容量存储和负载均衡的问题。特别适合以文件为载体的在线服务,如相册网站、视频网站等等。 FastDFS为互联网量身定制,充分考虑了冗余备份、负载均衡、线性扩容等机制,并注重高可用、高性能等指标,使用FastDFS很容易搭建一套高性能的文件服务器集群提供文件上传、下载等服务。 FastDFS服务端有两个角色:跟踪器(tra...
- 下一篇
Web 全栈大会:万维网之父的数据主权革命
大家好,今天我和大家分享一下由万维网之父发起的一场数据主权革命。什么叫数据主权?很容易理解,现在我们的数据是把持在巨头手里的,你的微信通讯录和聊天记录都无法导出,不管是从人权角度还是从法理角度,这些数据应该都是属于你的,但是你没有控制权,SoLiD 要做的核心的一件事就是让这些数据归于用户控制。它带来了一种全新的开发范式,这个范式是啥我们接下来会有介绍。那么什么是革命?革谁的命?也非常清晰,就是革那些体大不尊的巨头的命。 <!-- more --> 本文整理自蒸汽记忆创始人谢扬在 2019 年 11 月 16 日在成都 Web 全栈大会上的演讲,内容有删改。 完整PPT 可从 Github 上查看:https://leinue.github.io/webfullstack-2019/index.html 那么在开始之前呢,我先按照惯例自我介绍下。我目前在创业,我们公司的名字叫做蒸汽记忆,取自工业革命的开始,我们想做提高社会的生产力的事情,并将全球的公开信息变成知识图谱。我们的使命是在一个身份下互联全人类的文化基因,构建全球互联的生产力平台。同时,我是 SoLiD 中文网的发...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
-
Docker使用Oracle官方镜像安装(12C,18C,19C)
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS8编译安装MySQL8.0.19
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS7,8上快速安装Gitea,搭建Git服务器
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
推荐阅读
最新文章
- MySQL8.0.19开启GTID主从同步CentOS8
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- CentOS8编译安装MySQL8.0.19
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- SpringBoot2整合Redis,开启缓存,提高访问速度
- CentOS关闭SELinux安全模块
- Hadoop3单机部署,实现最简伪集群
- CentOS6,7,8上安装Nginx,支持https2.0的开启