gpt4 book ai didi

java - 流过滤器效果不佳我想打印 10 行

转载 作者:行者123 更新时间:2023-11-30 06:05:25 25 4
gpt4 key购买 nike

尽管我们有过滤器,为什么这个流不停止打印 1

有人能给我解释一下吗?此示例不准确,是操作流的最佳示例,仅供学习之用。

Stream.generate(() -> "1")
.peek(System.out::println)
.filter(x -> x.length() > 1)
.limit(10)
.forEach(System.out::println);

正确的是:

Stream.generate(() -> "1")
.limit(10)
.forEach(System.out::println);

最佳答案

将流视为管道。元素将不断从 generate 方法中产生。然后每个元素通过每个后续操作传递。

所以在你的代码中:

Stream.generate(() -> "1")
.peek(System.out::println)
.filter(x -> x.length() > 1)
.limit(10)
.forEach(System.out::println);

下面继续:

  • 生成了一个新的"1"
  • peek处,打印出您的“1”
  • filter处,如果"1"的长度大于1,则通过,否则丢弃
  • 如果 “1” 通过过滤器,它将达到限制。该限制只会让前 10 个元素通过。第10个元素之后,它会把这个元素扔掉

没有元素会通过过滤器,因为 "1" 的长度永远不会大于 1。limit 永远不会让足够的元素通过,因此终端操作未达到,它永远不会终止。

这就是它不断重复前两行的原因。

我现在将解释为什么颠倒 limitfilter 的顺序会起作用:

Stream.generate(() -> "1")
.peek(System.out::println)
.limit(10)
.filter(x -> x.length() > 1)
.forEach(System.out::println);

peek 将首先打印 10 个元素,然后通过 limit 位。那么所有这 10 个元素都不会通过 filter。但是这次到了终端操作,因为filter不像limit,是等10个元素再进行。整个过程终止,不再生成任何元素。

关于java - 流过滤器效果不佳我想打印 10 行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46501866/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com