gpt4 book ai didi

java - IntStream::noneMatch 可以不对流的所有元素评估谓词吗?

转载 作者:行者123 更新时间:2023-11-30 07:04:28 25 4
gpt4 key购买 nike

我阅读了 IntStream::noneMatch 的 Javadoc .

它说:

Returns whether no elements of this stream match the provided predicate. May not evaluate the predicate on all elements if not necessary for determining the result. If the stream is empty then true is returned and the predicate is not evaluated. 

我想知道是否存在 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 not evaluate on all elements. 时,它是否仅指 noneMatch 返回 false 的情况?

编辑:

我只是想澄清一下,我的问题不是为什么我发布的代码会评估整个流。我的问题是,是否存在这样一种情况,其中 noneMatch 返回 true 而不评估整个流

最佳答案

so it should be able to return true without evaluating any elements

不,为了检查没有元素匹配,它必须检查所有。换句话说,如果它返回 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

关于java - IntStream::noneMatch 可以不对流的所有元素评估谓词吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27636711/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com