阅读了一下Java8,我读到了这篇博文,解释了一些关于流和它们的减少,以及什么时候可以短路减少。在底部,它说:
请注意,在查找第一
个或查找任何情况下,
我们只需要与谓词匹配的第一个值(尽管查找任何
值不能保证返回第一个值)。但是,如果流没有排序,那么我们希望“查找第一”
的行为类似于“查找任何”
。所有匹配
、无匹配
和 anyMatch
操作可能根本不会使流短路,因为可能需要计算所有值来确定运算符是真
还是假
。因此,使用这些的无限流可能不会终止。
我知道findFirst
或findany
可能会使还原短路,因为一旦您找到一个元素,您就不需要进一步处理。
但是,为什么这对于< code>allMatch 、< code>noneMatch和< code>anyMatch是不可能的呢?对于< code>allMatch,如果发现一个与谓词不匹配的,可以停止处理。一样都没有。而< code>anyMatch对我来说尤其没有意义,因为它几乎等于< code>findAny(除了返回的内容)?
说这三个可能不会短路,因为可能需要计算所有值,也可以说findFirst/Any
。
我遗漏了一些根本的区别吗?我真的不明白发生了什么吗?
根据Oracle的流文档:https://docs . Oracle . com/javase/8/docs/API/Java/util/Stream/package-summary . html # Stream ops
如果当存在无限输入时,终端操作可能在有限的时间内终止,则该终端操作是短路的。在管道中发生短路操作是处理无限流的必要条件,但不是充分条件,以便在有限的时间内正常终止。
所有五个函数都有一行:
这是一个短路终端操作。
在函数的说明中。
答案已更新
我会说博客文章是错误的,当它说“找到第一个或找到任何我们只需要与谓词匹配的第一个值”。
在用于allMatch(谓词)、anyMatch(Predicate)、noneMatch(Predicate”)、findAny()和findFirst()的javadoc中:
这是一个短路终端操作。
但是,请注意findFirst
和findAny
没有0.05谓词。因此,它们都可以在看到第一个/任何值时立即返回。其他3个是有条件的,如果条件从不触发,则可能永远循环。
这有一个微妙的区别,因为anyMatch
family使用谓词,而findAny
family不使用谓词。从技术上讲,findAny()
看起来像anyMatch(x-
Stream<Integer> s = Stream.generate(() -> 1);
因此,将
findany()
应用于此类流确实总是会短路并完成,而应用anyMatch(pred)
取决于谓词。但是让我们过滤我们的无限流:
Stream<Integer> s = Stream.generate(() -> 1).filter(x -> x < 0);
结果流也是无限的吗?这是一个棘手的问题。它实际上不包含元素,但要确定它(例如,使用
.iterator())。hasNext()
)我们必须检查基础流元素的无限数量,因此此操作永远不会完成。我也会把这样的溪流称为无限。然而,使用这样的流anyMatch
和findAny
永远不会完成:
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