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

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());

这样输出:
one
two
three
four

Stream.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: one
Mapped value: ONE
Peeked value: two
Mapped value: TWO
Peeked value: three
Mapped value: THREE
Peeked value: four
Mapped value: FOUR

知道 peek() 方法接受一个实现了 consumer 接口的类,但是实在是搞不清楚到底它是如何运行的。

 

------------------------------------------------------------------------------------------------------------------------------------------------

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

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

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

 

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

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

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值