我正在阅读这本名为Modern Java in Action的书,其中一部分代码我无法理解。
IntStream.iterate(0, n -> n + 4)
.filter(n -> n < 100)
.forEach(System.out::println);
作者说代码不会终止。原因是过滤器中无法知道数字继续增加,因此它会继续无限过滤它们!
我没有得到原因。有人可以解释为什么。
我正在阅读这本名为Modern Java in Action的书,其中一部分代码我无法理解。
IntStream.iterate(0, n -> n + 4)
.filter(n -> n < 100)
.forEach(System.out::println);
作者说代码不会终止。原因是过滤器中无法知道数字继续增加,因此它会继续无限过滤它们!
我没有得到原因。有人可以解释为什么。
作者说代码不会终止。
是的,因为这种特定的过载iterate
static IntStream iterate(int seed,
IntUnaryOperator f)
返回由函数 f 迭代应用到初始元素种子产生的无限顺序有序 IntStream,产生由种子、f(seed)、f(f(seed)) 等组成的 Stream。
返回一个无限流,并且给定它是一个无限流,这意味着它只能通过某些操作终止。
鉴于此处使用的forEach
终端操作limit
(takeWhile
JDK8 中唯一的短路中间操作是limit
因为它允许对无限流的计算在有限时间内完成。
原因是过滤器中无法知道数字继续增加,因此它会继续无限过滤它们!
filter
本身不是短路中间操作,因此不能终止流。filter
的工作本质上是返回一个由与给定谓词匹配的流元素组成的流。
结论:如果一个人正在使用一个没有短路终端操作的无限流,那么它需要一个短路中间操作来截断流,否则流仍然是无限的。
int 流将生成一个从 0 开始,步长为 4 的数字序列。然后将它们过滤掉。Int 不断生成,因为没有终止条件。它相当于
for(int n=0;;n=n+4){... Filter out }