为了账号安全,请及时绑定邮箱和手机立即绑定

Java 8 peek() 方法的一些疑惑

Java 8 peek() 方法的一些疑惑

江户川乱折腾 2019-03-11 17:19:39
Stream.of("one", "two", "three", "four").peek(e -> System.out.println(e));这样不会有任何的输出;Stream.of("one", "two", "three", "four").peek(e -> System.out.println(e)).collect(Collectors.toList());这样输出:onetwothreefourStream.of("one", "two", "three", "four")    .peek(e -> System.out.println("Peeked value: " + e))    .map(String::toUpperCase)    .peek(e -> System.out.println("Mapped value: " + e))    .collect(Collectors.toList());这样输出:Peeked value: oneMapped value: ONEPeeked value: twoMapped value: TWOPeeked value: threeMapped value: THREEPeeked value: fourMapped value: FOUR知道 peek() 方法接受一个实现了 consumer 接口的类,但是实在是搞不清楚到底它是如何运行的。
查看完整描述

5 回答

?
慕仙森

TA贡献1827条经验 获得超8个赞

简单地说就是懒咯 你没有对流进行任何操作peek就不会执行

就是一个元素执行完所有操作之后再对下一个元素进行处理



查看完整回答
反对 回复 2019-04-17
?
阿晨1998

TA贡献2037条经验 获得超6个赞

peek不是终结操作,其返回值还是Stream,你这种情况应该用forEach


查看完整回答
反对 回复 2019-04-17
?
慕村225694

TA贡献1880条经验 获得超4个赞

处理流的方法分为惰性求值和及早求值(这两个概念不在此展开了),对流的处理通常包括一系列惰性求知加上一个及早求值;流遇到及早求值的时候,才会真正去遍历和执行


查看完整回答
反对 回复 2019-04-17
?
富国沪深

TA贡献1790条经验 获得超9个赞

java8流中所有的操作都是蓄而不发的,只有执行foreach,collect等终结操作时,流的操作才会执行。
而且流内部会自动进行优化,只要得到想要的解决就不会继续进行计算了。
peek是个中间操作,它提供了一种对流中所有元素操作的方法,而不会把这个流消费掉(foreach会把流消费掉),然后你可以继续对流进行其他操作。

查看完整回答
反对 回复 2019-04-17
?
慕哥9229398

TA贡献1877条经验 获得超6个赞

stream 分 中间操作 和 终端操作, (foreach, collect count)属于终端操作;

peek: 生成一个包含原Stream的所有元素的新Stream,同时会提供一个消费函数(Consumer实例),新Stream每个元素被消费的时候都会执行给定的消费函数;


查看完整回答
反对 回复 2019-04-17
  • 5 回答
  • 0 关注
  • 547 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号