Похоже, вы хотите сгруппировать элементы вашего списка по effect
, используя max(value)
в качестве агрегации.Вы можете сделать это следующим образом:
Map<String, Item> byEffectHavingMaxValue = listItems.stream()
.collect(Collectors.toMap(
Item::getEffect, // group by effect
Function.identity(), // keep items as values
BinaryOperator.maxBy( // when effect exists, keep the item with max value
Comparator.comparingInt(i -> Integer.parseInt(i.getValue())))));
Collection<Item> result = byEffectHavingMaxValue.values();
Приведенное выше решение собирает элементы потока в Map
.Для этого используется перегрузка Collectors.toMap
, для которой требуется 3 аргумента:
- keyMapper : a
Function
, преобразующий элементы потока включи - valueMapper :
Function
, преобразующий элементы потока в значения - mergeFunction :
BinaryOperator
, используемый для разрешенияконфликты между значениями, связанными с одним и тем же ключом
В этом случае ссылка на метод Item::getEffect
используется как функция keyMapper , которая преобразует экземпляр Item
в свойeffect
.Затем Function.identity()
используется в качестве функции valueMapper , которая ничего не делает, т.е. оставляет каждый экземпляр Item
без изменений.Наконец, BinaryOperator.maxBy(Comparator.comparingInt(i -> Integer.parseInt(i.getValue())))
используется как mergeFunction
, то есть BinaryOperator
, который получает два значения карты с одинаковым ключом (то есть два экземпляра Item
с одинаковым effect
) и разрешаетстолкновение на карте путем выбора экземпляра Item
, который имеет максимум value
(value
сначала преобразуется в Integer
, так что мы сравниваем числовые значения вместо строк).