Java 8 - список фильтров внутри значения карты
Я пишу метод, который принимает вход Map
формы Map<Term, List<Integer>>
где Term
определяется здесь.
Метод:
- Пройдите по клавишам
Map
и отфильтровать их, используяTerm
приписывать. - Для каждого из оставшихся ключей получите размер соответствующего списка, ограничьте его до 5 (
min(List.size(), 5)
) и добавить вывод в глобальную переменную (скажем,totalSum
) - Вернуть
totalSum
Это то, что я написал до сих пор:
inputMap
.entrySet()
.stream()
.filter(entry -> entry.getKey().field().equals(fieldName)) // Keep only terms with fieldName
.forEach(entry -> entry.getValue()
.map(size -> Math.min(entry.getValue().size(), 5))) // These 2 lines do not work
.sum();
Я не могу принять в качестве входных данных поток списков, вывести целое число для каждого из этих списков и вернуть сумму всех выходных данных.
Я, очевидно, могу написать его, используя циклы for, но я пытаюсь изучить Java 8, и мне было любопытно, разрешима ли эта проблема с его использованием.
3 ответа
Вам не нужно forEach
метод. Вы можете map
каждая запись Map
для int
, а также sum
эти целые числа:
int sum = inputMap
.entrySet()
.stream()
.filter(entry -> entry.getKey().field().equals(fieldName))
.mapToInt(entry -> Math.min(entry.getValue().size(), 5))
.sum();
С коллекциями Eclipse, следующие будут работать с использованием MutableMap и IntList.
MutableMap<Term, IntList> inputMap =
Maps.mutable.of(term1, IntLists.mutable.of(1, 2, 3),
term2, IntLists.mutable.of(4, 5, 6, 7));
long sum = inputMap
.select((term, intList) -> term.field().equals(fieldName))
.sumOfInt(intList -> Math.min(intList.size(), 5));
Примечание: я являюсь коммиттером для Eclipse Collections.
Вызов forEach завершает поток. Вы можете использовать карту напрямую без forEach.