java8 peek_java 8 Stream中操作类型和peek的使用
发布日期:2021-06-25 03:25:49 浏览次数:4 分类:技术文章

本文共 1988 字,大约阅读时间需要 6 分钟。

简介

java 8 stream作为流式操作有两种操作类型,中间操作和终止操作。这两种有什么区别呢?

我们看一个peek的例子:

Stream stream = Stream.of("one", "two", "three","four");

stream.peek(System.out::println);

上面的例子中,我们的本意是打印出Stream的值,但实际上没有任何输出。

为什么呢?

中间操作和终止操作

一个java 8的stream是由三部分组成的。数据源,零个或一个或多个中间操作,一个或零个终止操作。

中间操作是对数据的加工,注意,中间操作是lazy操作,并不会立马启动,需要等待终止操作才会执行。

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

所以,问题解决了,peek是一个中间操作,所以上面的例子没有任何输出。

peek

我们看下peek的文档说明:peek主要被用在debug用途。

我们看下debug用途的使用:

Stream.of("one", "two", "three","four").filter(e -> e.length() > 3)

.peek(e -> System.out.println("Filtered value: " + e))

.map(String::toUpperCase)

.peek(e -> System.out.println("Mapped value: " + e))

.collect(Collectors.toList());

上面的例子输出:

Filtered value: three

Mapped value: THREE

Filtered value: four

Mapped value: FOUR

上面的例子我们输出了stream的中间值,方便我们的调试。

为什么只作为debug使用呢?我们再看一个例子:

Stream.of("one", "two", "three","four").peek(u -> u.toUpperCase())

.forEach(System.out::println);

上面的例子我们使用peek将element转换成为upper case。然后输出:

one

two

three

four

可以看到stream中的元素并没有被转换成大写格式。

再看一个map的对比:

Stream.of("one", "two", "three","four").map(u -> u.toUpperCase())

.forEach(System.out::println);

输出:

ONE

TWO

THREE

FOUR

可以看到map是真正的对元素进行了转换。

当然peek也有例外,假如我们Stream里面是一个对象会怎么样?

@Data

@AllArgsConstructor

static class User{

private String name;

}

List userList=Stream.of(new User("a"),new User("b"),new User("c")).peek(u->u.setName("kkk")).collect(Collectors.toList());

log.info("{}",userList);

输出结果:

10:25:59.784 [main] INFO com.flydean.PeekUsage - [PeekUsage.User(name=kkk), PeekUsage.User(name=kkk), PeekUsage.User(name=kkk)]

我们看到如果是对象的话,实际的结果会被改变。

为什么peek和map有这样的区别呢?

我们看下peek和map的定义:

Stream peek(Consumer super T> action)

Stream map(Function super T, ? extends R> mapper);

peek接收一个Consumer,而map接收一个Function。

Consumer是没有返回值的,它只是对Stream中的元素进行某些操作,但是操作之后的数据并不返回到Stream中,所以Stream中的元素还是原来的元素。

而Function是有返回值的,这意味着对于Stream的元素的所有操作都会作为新的结果返回到Stream中。

这就是为什么peek String不会发生变化而peek Object会发送变化的原因。

结论

我们在本文中讲解了stream的两个操作类型,并总结了peek的使用。希望大家能够掌握。欢迎关注我的公众号:程序那些事,更多精彩等着您!

更多内容请访问

转载地址:https://blog.csdn.net/weixin_35901163/article/details/114613727 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:jsp中输出java中的属性_jsp:__________动作取得JavaBeans属性的值,并将其转换成字符串值,最后插入到输出结果中。...
下一篇:java编译字节码转化程序下载_编译与翻译,“编译”Java到字节码?

发表评论

最新留言

逛到本站,mark一下
[***.202.152.39]2024年03月16日 20时55分15秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章

mongodb创建数据库用户名和密码_mongodb给数据库创建用户密码 2019-04-21
.net api reference中文_.NET的关于人脸识别引擎分享(C#) 2019-04-21
10个数冒泡排序流程图_程序员必知必会的 10 个排序算法 2019-04-21
mysql存储过程需要设置_在MYSQL中使用存储过程要设置什么地方吗解决办法 2019-04-21
mysql有闪回吗_MySQL误删闪回工具 2019-04-21
mysql ndb存储引擎_mysql存储引擎memory,ndb,innodb之选择 2019-04-21
mysql 多条件查询优化_MySQL 多条件多排序查询优化 2019-04-21
mysql 5.7 io 性能 aio_(转)【干货】MySQL 5.7 多实例(多进程)配置教程 2019-04-21
sql ssas mdx 导出结果_DAX中按列排序的另一种结果 2019-04-21
iphone mysql 客户端_如何实现iphone端通过soap访问mysql数据库 2019-04-21
mysql 三天 分组查询_3mysql第三天 查询的指令补充 2019-04-21
lnmp怎么使用mysql_lnmp使用实例 2019-04-21
python 加密解密 rc4_python实现rc4加密解密,base64输出 2019-04-21
python3 字段key_Python3_模块(一) 2019-04-21
xlwings删除数据_超全整理|Python 操作 Excel 库 xlwings 常用操作详解! 2019-04-21
android 系统gpu 调试_详解Android获得系统GPU参数 gl.glGetString 2019-04-21
hibernate mysql utf8_hibernate建表默认为UTF-8编码 2019-04-21
mysql端口establish_establish_connection使用方法 2019-04-21
mysql备份命令有几个_MySQL数据库备份命令的几个实际应用 2019-04-21
e审通mysql连接错误_铭泰e审通安装后显示连接到数据库失败怎么处理 2019-04-21