我已经实现了一个 Java 流管道,其中对一些元素进行排序并检查它们是否全部满足谓词。管道看起来像这样:
items.stream()
.sorted(this::sortByType)
.allMatch(this::isCompliant);
谓词的验证在成本上有所不同。有些元素只需要检查属性,对于其中一些元素,我也必须从数据库中获取可能的许多元素并对其进行评估。
因为我需要知道所有都是真的,所以知道至少一个是假的,是等价的。如果我正确理解了 allMatch() 操作的 JavaDoc,那么只要有一个元素为 false,它就应该短路。
因此,为了潜在地提高执行速度,我对元素进行排序,以便首先执行所有非常简单的验证,并且只有当它们全部成功时,我才执行成本更高的验证。
至少我认为是这样的。然而,我的 IDE 告诉我,调用 allMatch() 之前进行排序是多余的,因为它不依赖于排序顺序。
我编写了一些测试,这些测试似乎表明排序顺序实际上是在遍历管道时考虑的,但也许我的测试用例太小或者只是碰巧被正确调用。
所以我的问题是: allMatch() 是否考虑预先施加的排序顺序?还是忽略它?
sort()
是一个statesfull 操作
allMatch()
- 是短路终端操作
Statesfull操作是将流分成两部分的操作。 IE。在这个操作中,所有元素都被收集起来,然后执行该操作。 IE。原始流在此停止并创建一个新的流。
短路终端操作是指在定义最终结果时,无需检查所有流项即可完成的操作。 allMatch()
当遇到第一个不匹配项时,操作将停止执行。
因此,当您使用
sort()
时,您的所有物品都会收集到一处。然后您使用 allMatch()
,它可能会在检查第一项后停止(如果它不匹配)。当您不使用
sort()
而仅使用allMatch()
时,绝对会给您最好的性能。