【发布时间】:2020-09-28 21:10:19
【问题描述】:
我正在阅读这本名为 Modern Java in Action 的书,其中一部分代码我无法理解。
IntStream.iterate(0, n -> n + 4)
.filter(n -> n < 100)
.forEach(System.out::println);
作者说代码不会终止。 原因是过滤器中无法知道数字继续增加,因此它会不断地无限过滤它们!
我没有得到原因。谁能解释一下原因。
【问题讨论】:
-
为什么这个帖子被关闭了?问题很清楚...... OP 希望更清楚地了解“为什么这个流不终止”
-
@Rakesh - 你能详细说明一下,指定原因中的哪一部分你不明白吗?
-
这实际上是一个不好的例子,因为
int值将溢出(在最新的环境中很快)并永远循环通过int数据范围。应该清楚的是,跳过[100‑Integer.MAX_VALUE]范围不会改变迭代的无限性质。一个更好的例子是Stream.iterate(BigInteger.ZERO, n -> n.add(BigInteger.TWO)) .filter(n -> n.compareTo(BigInteger.valueOf(100)) < 0) .forEach(System.out::println);。但是即使IntStream.generate(() -> 42) .filter(n -> false) .forEach(System.out::println);也会永远循环,尽管没有任何可感知的结果。 -
@Holger:我的意图是问为什么它不会停止,我相信这个例子已经足够好了。
-
但是为什么要停止呢?源流是无限的,
filter只告诉跳过不匹配的元素。假设它可以停止的唯一原因是假设在超过n < 100阈值后不会出现任何元素。这将是完全错误的,因为继续增加int值会溢出,并且在超过阈值后有 are 元素。谈到 Stream API,我的BigInteger示例将更好地说明这个问题,因为它表明即使超过阈值后真的没有元素,Stream 也会继续测试。
标签: java filter java-stream intstream