【发布时间】:2015-11-18 11:58:42
【问题描述】:
阅读了一些关于 Java 8 的内容后,我在 this 博客文章中解释了一些关于流和它们的归约,以及何时可以将归约短路。在底部它指出:
注意在
findFirst或findAny的情况下,我们只需要与谓词匹配的第一个值(尽管findAny不能保证返回第一个值)。但是,如果流没有排序,那么我们希望findFirst的行为类似于findAny。操作allMatch、noneMatch和anyMatch可能根本不会使流短路,因为它可能需要评估所有值来确定运算符是true还是false。因此,使用这些的无限流可能不会终止。
我知道findFirst 或findAny 可能会使归约短路,因为一旦找到元素,就不需要进一步处理。
但是为什么 allMatch、noneMatch 和 anyMatch 不可能呢?对于allMatch,如果你发现一个与谓词不匹配的,你可以停止处理。没有一样。 anyMatch 对我来说尤其没有意义,因为它几乎等于 findAny(除了返回的内容)?
说这三个可能不会短路,因为它可能需要评估所有值,也可以说findFirst/Any。
我缺少一些根本的区别吗?我真的不明白发生了什么吗?
【问题讨论】:
-
“may not”如“might not”,而不是“not allowed to”。
-
@Andreas 是的,我只是不明白差异来自哪里。一切都可以按照我的看法短路吗?
标签: java java-8 java-stream short-circuiting