【发布时间】:2021-07-02 17:07:19
【问题描述】:
如果中间操作消耗了流的一些元素,然后使用 peek(),但没有终止操作,那么 peek() 肯定还是应该产生一些输出吗?
【问题讨论】:
标签: java java-stream
如果中间操作消耗了流的一些元素,然后使用 peek(),但没有终止操作,那么 peek() 肯定还是应该产生一些输出吗?
【问题讨论】:
标签: java java-stream
如果中间操作消耗了流的某些元素
这是正确的。
但是,没有任何中间操作会消耗流的元素,所以,你知道的。充其量在技术上是正确的。
在这段代码中:
someCollection.stream().map(stuff).flatMap(otherStuff).filter(whatever).limit(20);
什么都不会发生。每个“元素”,例如.map(stuff),只是简单地注册一个IF 数据通过此流推送,通过此代码推送。它不消耗任何东西。这里没有终端,所以 none 提供的代码是 ever 运行的。
只有终端操作会导致数据流动,这样做时,所有数据都会通过所有这些中间体,而不是之前。
seek 因此并不特别。它与map、flatMap、filter、limit 和所有其他中间体处于同一“水平”:不会导致消耗,只是作为管道的一部分存在。
想象一下水管。 someCollection.stream() 是水的源头,中间的所有东西都是管道,最后的“终端”(max、collect、findAny、foreach 等)是水龙头。
如果您从不打开水龙头,那么您在生产线上放了多少花哨的小扇叶和其他水力玩具也没关系。他们都不会做任何事情。
【讨论】: