У меня есть поток объектов, и я хотел бы найти тот, у которого максимальное значение какого-то атрибута, которое дорого рассчитать.
Как конкретный простой пример, скажем, что у нас есть список строк, и мы хотим найти самый крутой, учитывая функцию coolnessIndex
.
Следующее должно работать:
String coolestString = stringList
.stream()
.max((s1, s2) -> Integer.compare(coolnessIndex(s1), coolnessIndex(s2)))
.orElse(null);
Теперь у нас есть две проблемы. Во-первых, если предположить, что coolnessIndex
дорого рассчитать, это, вероятно, будет не очень эффективным. Я полагаю, что метод max
должен будет повторно использовать компаратор, который, в свою очередь, будет называть coolnessIndex
несколько раз, а в конце он будет вызываться более одного раза для каждой строки.
Во-вторых, необходимость предоставления компаратора приводит к некоторой избыточности кода. Я бы предпочел синтаксис следующим образом:
String coolestString = stringList
.stream()
.maxByAttribute(s -> coolnessIndex(s))
.orElse(null);
Однако мне не удалось найти подходящий метод в API Stream
. Это меня удивляет, так как поиск min/max по атрибуту выглядит как общий шаблон. Интересно, есть ли лучший способ, чем использование компаратора (кроме цикла for).