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

IntStream::NoneMatch不能计算流的所有元素上的谓词吗?

傅鸿波
2023-03-14

我读了IntStream::NoneMatch. 的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而不计算任何元素。

编辑:

我只是想澄清一下,我的问题不是为什么我发布的代码会计算整个流。我的问题是,是否存在nonematch返回true而不计算整个流的场景。

共有1个答案

秦永望
2023-03-14

因此它应该能够返回true而不计算任何元素

不,为了检查所有元素都不匹配,它必须检查所有元素。换句话说,如果它返回true,那么它肯定已经查看了所有内容。换一种说法--你的逻辑依赖于谓词的作用,那么它怎么能在不求任何元素的情况下返回,而这意味着谓词永远不会被应用呢?

它可以返回true而不求所有元素的值的唯一方法是,它可以通过流的类型和有关谓词的信息来判断。例如,如果流“知道”它是uuid引用的流,并且谓词是“match strings”,那么它就不需要计算东西了--但我怀疑是否有任何东西试图进行这种优化。

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

boolean out = IntStream.range(1,10000)
               .peek(System.out::println)
               .noneMatch(i->i%4==3);
System.out.println(out);

那么您将得到以下输出:

1
2
3
false
 类似资料:
  • 我想知道是否有更好的(或只是其他)方法来获得进入流的终端操作的所有项目的计数,而不是以下方法: 其中给出了该阶段处理项目的实际计数。 我故意跳过了终端操作,因为这可能会在<代码>之间发生变化。forEach,或。收集。我确实知道。已经开始计数了,但只有我交换了一个

  • 以下是更详细的错误消息: 我将代码中的问题隔离在下面的某个地方,尽管我不知道抛出这个异常的具体原因: gradle.build-项目

  • 本文向大家介绍谓词演算,包括了谓词演算的使用技巧和注意事项,需要的朋友参考一下 谓词演算处理谓词,谓词包含变量。 谓词 谓词是在某个特定域上定义的一个或多个变量的表达式。通过给变量赋值或量化变量,可以使带有变量的谓词成为命题。 请请看以下语句。 拉姆是学生。 现在根据谓词演算来考虑以上陈述。 这里“是学生”是谓词,Ram是主题。 让我们将“ Ram”表示为x,将“是学生”表示为谓词P,然后可以将上

  • 我想数一数一条流的不同元素,我想知道为什么 不行,日蚀告诉我 类型收集器中的方法toMap(Function,Function,BinaryOperator)不适用于参数((s)- 顺便说一句,我知道这个解决方案: 所以我有两个问题: 我的第一个方法有什么错误 编辑:我自己解决了第一个问题: Java需要一个函数作为第二个参数。

  • 下面的lexer语法片段应该根据类中定义的谓词来标记“自定义名称”: CUSTOM_NAME的正确匹配总是尽可能长的匹配。现在,如果lexer遇到一个自定义名称,比如,那么我希望它对整个字符串,然后用'some:cname'作为参数调用一次谓词。 编辑:这种行为的有趣之处在于,只要将部分匹配传递给谓词,谓词的结果似乎完全被lexer忽略了。这似乎效率很低。

  • 我刚刚开始玩Java 8 lambda,我正在尝试实现一些我在函数式语言中习惯的东西。 例如,大多数函数语言都有某种对序列进行操作的find函数,或返回第一个元素的列表,该元素的谓词为。我能看到的在《Java八号》中实现这一点的唯一方法是: 然而,这似乎没有效率,因为过滤器将扫描整个列表,至少在我的理解(这可能是错误的)。有更好的办法吗?