Учитывая список элементов со свойствами, я пытаюсь получить последний элемент с максимальным значением указанного свойства.
Например, для следующего списка объектов:
t i
A: 3
D: 7 *
F: 4
C: 5
X: 7 *
M: 6
Я могу получить одну из вещей с самым высоким i
:
Thing t = items.stream()
.max(Comparator.comparingLong(Thing::getI))
.orElse(null);
Тем не менее, это даст мне Thing t = D
Есть ли чистый и элегантный способ получить последний элемент, то есть X
в этом случае?
Одно из возможных решений с помощью reduce
функции. Тем не менее, свойство рассчитывается на лету и будет выглядеть так:
Thing t = items.stream()
.reduce((left, right) -> {
long leftValue = valueFunction.apply(left);
long rightValue = valueFunction.apply(right);
return leftValue > rightValue ? left : right;
})
.orElse(null);
valueFunction
теперь нужно вызывать почти вдвое чаще.
Другие очевидные обходные решения:
- Храните объект в кортеже с его индексом
- Сохраните объект в кортеже с его вычисленным значением
- Переверните список заранее
- Не используйте потоки