【问题标题】:IntStream iterate function with filter带过滤器的 IntStream 迭代函数
【发布时间】: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 -&gt; n.add(BigInteger.TWO)) .filter(n -&gt; n.compareTo(BigInteger.valueOf(100)) &lt; 0) .forEach(System.out::println);。但是即使IntStream.generate(() -&gt; 42) .filter(n -&gt; false) .forEach(System.out::println); 也会永远循环,尽管没有任何可感知的结果。
  • @Holger:我的意图是问为什么它不会停止,我相信这个例子已经足够好了。
  • 但是为什么要停止呢?源流是无限的,filter 只告诉跳过不匹配的元素。假设它可以停止的唯一原因是假设在超过n &lt; 100 阈值后不会出现任何元素。这将是完全错误的,因为继续增加 int 值会溢出,并且在超过阈值后有 are 元素。谈到 Stream API,我的BigInteger 示例将更好地说明这个问题,因为它表明即使超过阈值后真的没有元素,Stream 也会继续测试。

标签: java filter java-stream intstream


【解决方案1】:

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

for(int n=0;;n=n+4){... Filter out }

【讨论】:

    【解决方案2】:

    作者说代码不会终止。

    是的,因为iterate这个特定的重载

    static IntStream iterate(int seed,
                             IntUnaryOperator f)
    

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

    返回一个无限流,鉴于它是一个无限流,这意味着它只能通过某些操作来终止。

    鉴于此处使用的终端操作 (forEach) 没有短路,这意味着您需要“短路中间操作”来截断这种特定情况下的无限流,例如limit (JDK8),takeWhile (JDK9) 等。

    唯一的short-circuiting intermediate operation in JDK8limit,因为它允许对无限流的计算在有限时间内完成。

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

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

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

    【讨论】:

    • 很好的解释奥斯曼。我明白了为什么它没有终止。
    猜你喜欢
    • 1970-01-01
    • 2017-03-14
    • 2012-06-19
    • 2015-02-23
    • 1970-01-01
    • 1970-01-01
    • 2012-01-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多