2

我正在阅读这本名为Modern Java in Action的书,其中一部分代码我无法理解。

      IntStream.iterate(0, n -> n + 4)
                .filter(n -> n < 100)
                .forEach(System.out::println);

作者说代码不会终止。原因是过滤器中无法知道数字继续增加,因此它会继续无限过滤它们!

我没有得到原因。有人可以解释为什么。

4

2 回答 2

1

作者说代码不会终止。

是的,因为这种特定的过载iterate

static IntStream iterate(int seed,
                         IntUnaryOperator f)

返回由函数 f 迭代应用到初始元素种子产生的无限顺序有序 IntStream,产生由种子、f(seed)、f(f(seed)) 等组成的 Stream。

返回一个无限流,并且给定它是一个无限流,这意味着它只能通过某些操作终止。

鉴于此处使用的forEach终端操作limittakeWhile

JDK8 中唯一的短路中间操作limit因为它允许对无限流的计算在有限时间内完成。

原因是过滤器中无法知道数字继续增加,因此它会继续无限过滤它们!

filter本身不是短路中间操作,因此不能终止流。filter的工作本质上是返回一个由与给定谓词匹配的流元素组成的流。

结论:如果一个人正在使用一个没有短路终端操作的无限流,那么它需要一个短路中间操作来截断流,否则流仍然是无限的。

于 2020-06-09T16:58:18.080 回答
0

int 流将生成一个从 0 开始,步长为 4 的数字序列。然后将它们过滤掉。Int 不断生成,因为没有终止条件。它相当于

for(int n=0;;n=n+4){... Filter out }
于 2020-06-09T16:11:55.147 回答