У меня есть заказанный List
примерно из миллиона элементов, из которых я ищу последний элемент, который соответствует указанному условию c, но условие тяжело вычислить, поэтому лучше, если я начну с конца вместо. Всегда есть примерно 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;
}
}
Есть ли способ написать это, используя Stream
s, так что heavyConditionPredicate
не проверяется по каждому элементу списка? Если бы HeavyConditionPredicate не был бы таким тяжелым для вычислений, я бы использовал альтернативные средства , но мне не везет.
Обратите внимание, что elements
может быть любым типом List
, а тот, который я получаю, не обязательно реализует RandomAccess
, поэтому доступ к списку по их индексу также может быть дорогостоящим.