使用 Stream 从列表中查找与昂贵条件匹配的最后一个元素

Oli*_*ire 7 java list java-stream

我有大约一百万个元素的订单List,我正在寻找与特定条件匹配的最后一个元素,但条件计算起来很繁重,所以最好从末尾开始。总有大致log(n)匹配的元素,最少为 1 个。

我可以手动完成:

List<Element> elements = ...;
Element element = null;
for (var it = elements.listIterator(elements.size()); it.hasPrevious(); ) {
  var candidate = it.previous();
  if (heavyConditionPredicate.test(candidate)) {
    element = candidate;
    break;
  }
}
Run Code Online (Sandbox Code Playgroud)

有什么方法可以使用Streams 来编写此代码,这样就heavyConditionPredicate不会针对列表中的每个元素进行测试?如果 HeavyConditionPredicate 的计算量不会那么大,我会使用替代方法,但我没那么幸运。

请注意,elements可以是 的任何类型List,并且我得到的不一定实现RandomAccess,因此通过索引访问列表可能也很昂贵。

Oli*_*ire 5

GuavaLists::reverse在这里绝对有帮助,因为它是一个视图,它不会修改我的列表,也不会通过索引访问元素:

Lists.reverse(elements).stream()
  .filter(heavyConditionPredicate)
  .findFirst();
Run Code Online (Sandbox Code Playgroud)