当前位置: 首页 > 知识库问答 >
问题:

带过滤器的IntStream迭代函数

潘翊歌
2023-03-14

我当时正在读一本名为《现代Java在行动》的书,其中一部分代码我无法理解。

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

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

我不明白原因。有人能解释一下为什么吗。

共有2个答案

云航
2023-03-14

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

for(int n=0;;n=n+4){... Filter out }
吕自明
2023-03-14

作者表示,代码不会终止。

是的,因为迭代的这个特定重载

static IntStream iterate(int seed,
                         IntUnaryOperator f)

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

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

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

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

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

过滤器本身不是短路中间操作,因此无法终止流<代码>过滤器的工作本质上是返回一个流,该流由与给定谓词匹配的流元素组成。

结论:如果使用的是没有短路终端操作的无限流,则需要短路中间操作来截断流,否则流将保持无限。

 类似资料:
  • 问题内容: 如何使用IntStream在step(3)中迭代数字范围(0-100)? 我试过了,但这从未停止执行。 问题答案: 实际上,这是理想的。 编辑:Holgers的解决方案是性能最快的解决方案。 由于以下几行代码 显示这些基准结果

  • 我正在使用PyThon和熊猫。 在网球比赛中,我想通过以下方式过滤我的数据: 检查获胜者是某个玩家 检查失败者是否在指定的集合内 我试着用下面的方法来做 其中df是存储我的数据的数据帧对象。 我得到以下错误: 我理解错误。但是我还没有想出办法来解决它。 我如何进行过滤,使df.loser根据许多值进行检查,而不是像df.winner==player这样的值?

  • 本文向大家介绍AngularJS入门教程之迭代器过滤详解,包括了AngularJS入门教程之迭代器过滤详解的使用技巧和注意事项,需要的朋友参考一下 我们在上一步做了很多基础性的训练,所以现在我们可以来做一些简单的事情喽。我们要加入全文检索功能(没错,这个真的非常简单!)。同时,我们也会写一个端到端测试,因为一个好的端到端测试可以帮上很大忙。它监视着你的应用,并且在发生回归的时候迅速报告。 请重置工

  • 如果我使用而不是,链接是否会改变结果? 我尝试了几千条记录,结果在几次迭代中都是一致的。但由于这涉及到线程(我找不到足够的相关材料来讨论这种组合),我想双重确保并行流不会以任何方式影响过滤器链接的输出。示例代码:

  • 问题内容: 我正在尝试建立一个查询,该查询将找到所有用户文档(docType =用户),然后根据许多过滤器对其进行过滤。例如位置,性别,年龄等。过滤器是根据我正在构建的搜索功能上的用户输入来添加/删除的。 以下没有结果: 以下返回结果: 后者虽然返回结果,但从长远来看是行不通的,因为我可能想为年龄,性别等添加一个额外的过滤器,而且我似乎无法添加多个字段。如果我删除位置过滤器,则第一个查询有效。 问