Java 8 - список фильтров внутри значения карты

Я пишу метод, который принимает вход Map формы Map<Term, List<Integer>> где Term определяется здесь.

Метод:

  1. Пройдите по клавишам Map и отфильтровать их, используя Term приписывать.
  2. Для каждого из оставшихся ключей получите размер соответствующего списка, ограничьте его до 5 (min(List.size(), 5)) и добавить вывод в глобальную переменную (скажем, totalSum)
  3. Вернуть 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.

Другие вопросы по тегам