在使用具有不同成本的谓词调用 allMatch 之前对 Java 流进行排序是否会带来任何好处?

问题描述 投票:0回答:1

我已经实现了一个 Java 流管道,其中对一些元素进行排序并检查它们是否全部满足谓词。管道看起来像这样:

items.stream()
     .sorted(this::sortByType)
     .allMatch(this::isCompliant);

谓词的验证在成本上有所不同。有些元素只需要检查属性,对于其中一些元素,我也必须从数据库中获取可能的许多元素并对其进行评估。

因为我需要知道所有都是真的,所以知道至少一个是假的,是等价的。如果我正确理解了 allMatch() 操作的 JavaDoc,那么只要有一个元素为 false,它就应该短路。

因此,为了潜在地提高执行速度,我对元素进行排序,以便首先执行所有非常简单的验证,并且只有当它们全部成功时,我才执行成本更高的验证。

至少我认为是这样的。然而,我的 IDE 告诉我,调用 allMatch() 之前进行排序是多余的,因为它不依赖于排序顺序。

我编写了一些测试,这些测试似乎表明排序顺序实际上是在遍历管道时考虑的,但也许我的测试用例太小或者只是碰巧被正确调用。

所以我的问题是: allMatch() 是否考虑预先施加的排序顺序?还是忽略它?

java sorting java-stream
1个回答
0
投票
这个 IDE 是对的。这里有两个操作:

  • sort()
     是一个 
    statesfull 操作
  • allMatch()
     - 是
    短路终端操作

Statesfull操作是将流分成两部分的操作。 IE。在这个操作中,所有元素都被收集起来,然后执行该操作。 IE。原始流在此停止并创建一个新的流。

短路终端操作是指在定义最终结果时,无需检查所有流项即可完成的操作。 allMatch() 当遇到第一个不匹配项时,操作将停止执行。

因此,当您使用
sort()

时,您的所有物品都会收集到一处。然后您使用

allMatch()

 ,它可能会在检查第一项后停止(如果它不匹配)。当您
不使用
sort()而仅使用
allMatch()时,绝对会给您最好的
性能。

© www.soinside.com 2019 - 2024. All rights reserved.