Функция valueFunction теперь должна вызываться почти в два раза чаще.
Обратите внимание, что даже при использовании max
метод getI
будет вызываться снова и снова для каждого сравнения, а не только один раз за элемент.В вашем примере он вызывается 11 раз, в том числе 6 раз для D, и для более длинных списков он также вызывается в среднем дважды на элемент.
Как насчет того, чтобы просто кэшировать вычисленное значение непосредственно вThing
экземпляр?Если это невозможно, вы можете использовать внешний Map
и использовать calculateIfAbsent
для вычисления значения только один раз для каждого Thing
, а затем использовать свой подход, используя reduce
.
Map<Thing, Long> cache = new HashMap<>();
Thing x = items.stream()
.reduce((left, right) -> {
long leftValue = cache.computeIfAbsent(left, Thing::getI);
long rightValue = cache.computeIfAbsent(right, Thing::getI);
return leftValue > rightValue ? left : right;
})
.orElse(null);
илинемного чище, заранее вычисляя все значения:
Map<Thing, Long> cache = items.stream()
.collect(Collectors.toMap(x -> x, Thing::getI));
Thing x = items.stream()
.reduce((left, right) -> cache.get(left) > cache.get(right) ? left : right)
.orElse(null);