Java IntStream::noneMatch是否可以对流的所有元素计算谓词?

Java IntStream::noneMatch是否可以对流的所有元素计算谓词?,java,java-8,java-stream,Java,Java 8,Java Stream,我读过的Javadoc 它说: 返回此流的元素是否与提供的谓词匹配。如果不需要确定结果,则不能对所有元素的谓词求值。如果流为空,则返回true,并且不计算谓词 我想知道是否有一个实际的场景,其中noneMatch不会对流的所有元素计算谓词并返回true。在noneMatch返回false的情况下,很明显,在找到第一个匹配之前,谓词只对元素进行计算 我能想到的唯一情况是,如果流管道有一个过滤器,其谓词与noneMatch的谓词完全相反,那么noneMatch可能会在不测试任何元素的情况下返回tru

我读过的Javadoc

它说:

返回此流的元素是否与提供的谓词匹配。如果不需要确定结果,则不能对所有元素的谓词求值。如果流为空,则返回true,并且不计算谓词

我想知道是否有一个实际的场景,其中noneMatch不会对流的所有元素计算谓词并返回true。在noneMatch返回false的情况下,很明显,在找到第一个匹配之前,谓词只对元素进行计算

我能想到的唯一情况是,如果流管道有一个过滤器,其谓词与noneMatch的谓词完全相反,那么noneMatch可能会在不测试任何元素的情况下返回true

但是,当使用以下代码进行测试时:

boolean out = IntStream.range(1, 10000)
                  .filter(i -> i % 2 == 0)
                  .peek(System.out::println)
                  .noneMatch(i -> i % 2 == 1);
System.out.println(out);
我得到从2到9998的偶数输出:

2
4
6
...
9998
true
这意味着对整个流进行了计算,即使过滤器只返回偶数整数,而noneMatch谓词不需要找到奇数整数,因此它应该能够在不计算任何元素的情况下返回true

那么,当Javadoc说May不能对所有元素求值时,它是否只指noneMatch返回false的情况

编辑:

我只是想澄清我的问题不是为什么我发布的代码会对整个流进行评估。我的问题是,是否存在这样一种场景:noneMatch在不计算整个流的情况下返回true

因此,它应该能够在不计算任何元素的情况下返回true

不,为了检查所有元素是否匹配,它必须检查所有元素。换句话说,如果它返回true,那么它肯定会查看所有内容。换句话说,您的逻辑依赖于谓词所做的事情,那么它如何在不计算任何元素的情况下返回,而这意味着谓词永远不会被应用

它可以返回true而不计算所有元素的唯一方法是,它可以仅通过流的类型和谓词的某些信息来判断。例如,如果流知道它是一个UUID引用流,并且谓词是匹配字符串,那么它就不需要求值了——但我怀疑是否有任何东西试图进行这种优化

但是,如果且仅当它找到与谓词匹配的内容时,它可以返回false而不查看其余项

例如,如果将代码更改为:

boolean out = IntStream.range(1,10000)
               .peek(System.out::println)
               .noneMatch(i->i%4==3);
System.out.println(out);
然后您将获得以下输出:

1
2
3
false

因此,您要说的是,如果不是确定结果所必需的,那么可能不会对所有元素求值谓词。仅适用于noneMatch返回false的情况?Javadoc没有明确说明,所以我想知道是否有情况下is返回true而不计算所有元素。@Eran:我用一个可能的场景编辑了我的答案,但我认为它没有实际实现,当然它不适用于您给出的示例。好吧,将来的版本可能会检测到相互矛盾的谓词。或者,将来的API可能有一个Predicate.matchNone常量,当传递给Stream.filter时,该常量将被识别。或者,它可能会识别映射操作何时具有不依赖于其输入的函数,在这种情况下,检查单个元素就足以确定整个结果。