java peek函数_Java 8 Stream Api 中的 peek 操作
1. 前言
我在 Java 8 Stream API中的 map 和flatMap 中讲述了Java8 Stream API中 map 操作和 flatMap 操作的区别。然后有小伙伴告诉我 peek 操作 也能实现元素的处理。但是你知道 map 和 peek 的区别吗? map 我们在开头文章已经讲过了,你可以去详细了解一下它,本文将重点讲解一下 peek 操作。
2. peek
peek 操作接收的是一个 Consumer 函数。顾名思义 peek 操作会按照 Consumer 函数提供的逻辑去消费流中的每一个元素,同时有可能改变元素内部的一些属性。
这里我们要提一下这个 Consumer 以理解 什么是消费。
2.1 什么是消费 (Consumer)
package java.util.function;
import java.util.Objects;
@FunctionalInterface
public interface Consumer {
void accept(T t);
// 嵌套accept , 顺序为先执行 accept 后执行参数里的 after.accpet
default Consumer andThen(Consumer super T> after) {
Objects.requireNonNull(after);
return (T t) -> { accept(t); after.accept(t); };
}
}
Consumer 是一个函数接口。一个抽象方法 void accept(T t) 意为接受一个 T 类型的参数并将其消费掉。其实消费给我的感觉就是 “用掉” ,自然返回的就是 void 。 通常“用掉” T 的方式为两种:
T 本身的 void 方法 比较典型的就是 setter 。
把 T 交给其它接口(类)的 void 方法进行处理 比如我们经常用的打印一个对象 System.out.println(T)
2.2 peek 操作演示
Stream stream = Stream.of("hello", "felord.cn");
stream.peek(System.out::println);
如果你测试了上面给出的代码你会发现,压根不会按照逻辑跑。这是为啥子呢? 这是因为流的生命周期有三个阶段:
起始生成阶段。
中间操作会逐一获取元素并进行处理。 可有可无。所有中间操作都是惰性的,因此,流在管道中流动之前,任何操作都不会产生任何影响。
终端操作。通常分为 最终的消费 (foreach 之类的)和 归纳 (collect)两类。还有重要的一点就是终端操作启动了流在管道中的流动。
所以应该改成下面:
Stream stream = Stream.of("hello", "felord.cn");
List strs= stream.peek(System.out::println).collect(Collectors.toLIst());
比如下图,我们给圆球加了一个框:
3. peek VS map
peek 操作 一般用于不想改变流中元素本身的类型或者只想操作元素的内部状态时;而 map 则用于改变流中元素本身类型,即从元素中派生出另一种类型的操作。这是他们之间的最大区别。
那么 peek 实际中我们会用于哪些场景呢?比如对 Stream 中的 T 的某些属性进行批处理的时候用 peek 操作就比较合适。 如果我们要从 Stream 中获取 T 的某个属性的集合时用 map 也就最好不过了。
4. 总结
我们今天了解 Stream 的 peek 操作,同时也回顾了 Stream 的生命周期。也顺带对 Consumer 函数进行了讲解。而且 和 map 相互做了比较,对各自的使用场景又做了说明。相信看过本文后你对它们会有更深的理解。
关注公众号:Felordcn获取更多资讯
java peek函数_Java 8 Stream Api 中的 peek 操作相关推荐
- Java 8 Stream Api 中的 peek、map、foreach区别
#1. 前言 我在Java8 Stream中讲述了 Java 8 Stream API 的一些内容.今天再看一下peek.map.foreach区别. 2. peek peek 操作接收的是一个 Co ...
- Java 8 Stream Api 中的 skip 和 limit 操作
点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 1. 前言 Java 8 Stream API 中的sk ...
- Java 8 新特性之Stream API
1. 概述 1.1 简介 Java 8 中有两大最为重要的改革,第一个是 Lambda 表达式,另外一个则是 Stream API(java.util.stream.*). Stream 是 Java ...
- java 字符串函数_Java字符串函数– 25+必须知道方法
java 字符串函数 Java字符串函数 (Java String Functions) Java String class has a lot of functions to manipulate ...
- java steam说明_Java 8 Steam API map和flatMap方法使用详解
一对多的提取内容用flatmap,一对一用map java 8 stream api 中有两个方法map和flatMap非常实用,应用场景也非常广泛,能极大提升编程效率.下面我们详细介绍一下这两个方法 ...
- Atitit 实现java的linq 以及与stream api的比较
Atitit 实现java的linq 以及与stream api的比较 1.1. Linq 和stream api的关系,以及主要优缺点1 1.2. Linq 与stream api的适用场景1 1. ...
- Java 8 Stream Api 中的 map和 flatMap 操作
点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 来源 | 公众号「码农小胖哥」 1.前言 Java 8 ...
- java虚拟函数_java实现多态中的虚函数相关概念
本文转载自参考博客 1. Java虚函数 虚函数的存在是为了多态. C++中普通成员函数加上virtual关键字就成为虚函数 Java中其实没有虚函数的概念,它的普通函数就相当于C++的虚函数,动态绑 ...
- stream去重_使用Java Stream API中DistinctBy删除重复数据
Stream API提供distinct()方法,该方法基于数据Object类的equals()方法返回列表的不同元素.下面先做一个数据Object类,用来发现重复数据: public class L ...
最新文章
- Node搭建静态资源服务器时后缀名与响应头映射关系的Json文件
- php post 获取xml,php 获取post的xml数据并解析示例
- UITabBarController使用总结
- html判断是安卓还是苹果手机,网页能够自己判断是pc端首页还是手机android和苹果。...
- Linux 环境变量PATH设置和查看etc/profile和bashrc的区别
- asp连接mysql oledb_provider=microsoft.jet.oledb……数据库连接方法的疑惑?
- http://mirrors.aliyuncs.com/centos/7/extras/x86_64/repodata/repomd.xml: [Errno 12] Timeout on http:/
- 基于OpencCV的彩色图像的分离与合并
- c语言十六实验答案,《C语言》上机实验题及参考答案
- mysql 修改max_allowed_packet
- 存储过程中SELECT INTO的使用
- 程序上下文切换,什么是上下文?
- 软件测试行业前景,人才稀缺
- 数据库基础学习(思维导图)
- Ajax的回调函数(js与JQuery写法)
- RestTemplate.exchange各种用法(包括泛型等 --全)
- mysql左连接查询时多条件的注意事项
- 变电站无线测温系统的特点与应用
- 认知升级:什么才是真正的高情商?
- MySQL的binLog、redoLog、undoLog是什么?
热门文章
- python 3d重建_3D点云重建原理及Pytorch实现
- php制作图片轮播_图片轮播效果实现方法
- mac mysql my.cnf_mac 增加 my.cnf
- UE4 Fix – “Lighting build failed. Swarm failed to kick off.”
- 用Crossdev安装MIPS交叉编译工具链
- AM335X 分配大于4M的framebuffer
- 【转】C++学习四 冒泡排序法的一些改进
- 第三节:深度剖析各类数据结构(Array、List、Queue、Stack)及线程安全问题和yeild关键字
- Java对象分配原理
- 【Python 必会技巧】对字典按照键(key)或者值(value)排序