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

爪哇 8 流短路

姬衡
2023-03-14

阅读了一下Java8,我读到了这篇博文,解释了一些关于流和它们的减少,以及什么时候可以短路减少。在底部,它说:

请注意,在查找第一个或查找任何情况下,我们只需要与谓词匹配的第一个值(尽管查找任何值不能保证返回第一个值)。但是,如果流没有排序,那么我们希望“查找第一”的行为类似于“查找任何”。所有匹配无匹配anyMatch 操作可能根本不会使流短路,因为可能需要计算所有值来确定运算符是还是。因此,使用这些的无限流可能不会终止。

我知道findFirstfindany可能会使还原短路,因为一旦您找到一个元素,您就不需要进一步处理。

但是,为什么这对于< code>allMatch 、< code>noneMatch和< code>anyMatch是不可能的呢?对于< code>allMatch,如果发现一个与谓词不匹配的,可以停止处理。一样都没有。而< code>anyMatch对我来说尤其没有意义,因为它几乎等于< code>findAny(除了返回的内容)?

说这三个可能不会短路,因为可能需要计算所有值,也可以说findFirst/Any

我遗漏了一些根本的区别吗?我真的不明白发生了什么吗?

共有3个答案

壤驷文华
2023-03-14

根据Oracle的流文档:https://docs . Oracle . com/javase/8/docs/API/Java/util/Stream/package-summary . html # Stream ops

如果当存在无限输入时,终端操作可能在有限的时间内终止,则该终端操作是短路的。在管道中发生短路操作是处理无限流的必要条件,但不是充分条件,以便在有限的时间内正常终止。

所有五个函数都有一行:

这是一个短路终端操作。

在函数的说明中。

司空坚
2023-03-14

答案已更新

我会说博客文章是错误的,当它说“找到第一个或找到任何我们只需要与谓词匹配的第一个值”。

在用于allMatch(谓词)、anyMatch(Predicate)、noneMatch(Predicate”)、findAny()和findFirst()的javadoc中:

这是一个短路终端操作。

但是,请注意findFirstfindAny没有0.05谓词。因此,它们都可以在看到第一个/任何值时立即返回。其他3个是有条件的,如果条件从不触发,则可能永远循环。

马边浩
2023-03-14

这有一个微妙的区别,因为anyMatchfamily使用谓词,而findAnyfamily不使用谓词。从技术上讲,findAny()看起来像anyMatch(x-

Stream<Integer> s = Stream.generate(() -> 1);

因此,将findany()应用于此类流确实总是会短路并完成,而应用anyMatch(pred)取决于谓词。但是让我们过滤我们的无限流:

Stream<Integer> s = Stream.generate(() -> 1).filter(x -> x < 0);

结果流也是无限的吗?这是一个棘手的问题。它实际上不包含元素,但要确定它(例如,使用.iterator())。hasNext())我们必须检查基础流元素的无限数量,因此此操作永远不会完成。我也会把这样的溪流称为无限。然而,使用这样的流anyMatchfindAny永远不会完成:

Stream.generate(() -> 1).filter(x -> x < 0).anyMatch(x -> true);
Stream.generate(() -> 1).filter(x -> x < 0).findAny();

所以findany()也不能保证完成,它取决于之前的中间流操作。

最后,我认为这篇博文非常具有误导性。在我看来,无限流行为在官方JavaDoc中得到了更好的解释。

 类似资料:
  • 问题内容: 我有这个Java代码段。我是Java的菜鸟。 错误: 码: 问题答案: 是的,这是问题所在: 在课程的最高级别,您只能拥有: 实例初始化程序块() 静态初始值设定块() 变量声明 构造函数声明 方法声明 嵌套类型声明 终结器声明 这些都不是。如果你 的意思 来声明一个变量,你应该这样做: 如果这 不是 您想要的,则应解释您的意图。 编辑:修复此问题后,此编译器错误似乎很明显: Conf

  • 我已经红色了多篇文章和讨论,但我仍然有一些不确定性:我不确定是否应该使用或任何其他类型来存储预订-在“在线预订”的意义上(因此来自不同国家/时区的参与者需要在时间线上的同一时刻会面)。我倾向于使用,因为DB和Backend设置为UTC,并且由于传入的“创建预订”json消息包含ISO 8601(带偏移量)start DateTime 让我们采用以下设置:1.数据库(UTC、Oracle、MSSQL

  • 我的问题是关于cucumber特性文件的并行执行。在Selenium Java中,可以通过一个runner类并行运行多个cucumber特性文件吗? 我尝试过不同的方法,但都没有成功。

  • 问题内容: 阅读了有关Java 8的一些知识后,我进入了这篇博客文章,解释了有关流及其还原的一些知识,以及何时有可能使还原短路。在底部,它指出: 请注意,在或的情况下,我们只需要与谓词匹配的第一个值(尽管不能保证返回第一个)。但是,如果流没有排序,则我们的行为应类似于。的操作,并且可能不会短路,因为在所有它的流可能需要评估所有的值,以确定操作者是否是或。因此,使用它们的无限流可能不会终止。 我知道

  • 当我运行程序而不是找到骑士之旅时,我收到了一个StackOverflow错误。任何想法是什么导致了这一点,以及我如何改变我的代码,实际上找到骑士之旅,并摆脱这个错误。项目是为我的CS280课程,并在周五到期,请帮助。谢谢!!

  • 一个能够让程序猿快速开发的炒鸡脚手架,核心技术Spring、JPA、Shiro。 基础环境 JDK1.8、Maven、Mysql、Redis、IntelliJ IDEA、minio、fastdfs 相关组件 - ok-admin - vue - iView - echarts - clipboard - cropperjs - lightbox - nprogress - webuploader