【问题标题】:Why is it that Stream.peek() produces no output without a terminal operation? [duplicate]为什么没有终端操作 Stream.peek() 不产生输出? [复制]
【发布时间】:2021-07-02 17:07:19
【问题描述】:

如果中间操作消耗了流的一些元素,然后使用 peek(),但没有终止操作,那么 peek() 肯定还是应该产生一些输出吗?

【问题讨论】:

    标签: java java-stream


    【解决方案1】:

    如果中间操作消耗了流的某些元素

    这是正确的。

    但是,没有任何中间操作会消耗流的元素,所以,你知道的。充其量在技术上是正确的。

    在这段代码中:

    someCollection.stream().map(stuff).flatMap(otherStuff).filter(whatever).limit(20);
    

    什么都不会发生。每个“元素”,例如.map(stuff),只是简单地注册一个IF 数据通过此流推送,通过此代码推送。它不消耗任何东西。这里没有终端,所以 none 提供的代码是 ever 运行的。

    只有终端操作会导致数据流动,这样做时,所有数据都会通过所有这些中间体,而不是之前。

    seek 因此并不特别。它与mapflatMapfilterlimit 和所有其他中间体处于同一“水平”:不会导致消耗,只是作为管道的一部分存在。

    想象一下水管。 someCollection.stream() 是水的源头,中间的所有东西都是管道,最后的“终端”(maxcollectfindAnyforeach 等)是水龙头。

    如果您从不打开水龙头,那么您在生产线上放了多少花哨的小扇叶和其他水力玩具也没关系。他们都不会做任何事情。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-12
      • 1970-01-01
      • 1970-01-01
      • 2014-02-10
      • 1970-01-01
      相关资源
      最近更新 更多