Подтвердить что ты не робот

Java 8 stream Map <K, V> в список <T>

Учитывая, что у меня есть некоторая функция, которая принимает два параметра и возвращает одно значение, возможно ли преобразовать карту в список в потоке в качестве нетерминальной операции? Ближайшая я cam find - использовать forEach на карте для создания экземпляров и добавления их в предварительно определенный список, а затем запустить новый поток из этого списка. Или я просто что-то пропустил?

Например: классический "найти 3 наиболее часто встречающихся слова в некотором длинном списке слов"

wordList.stream().collect(groupingBy(Function.identity, Collectors.counting))).

(теперь я хочу передать запись в эту карту)

sorted((a,b) -> a.getValue().compareTo(b.getValue))).limit(3).forEach(print...
4b9b3361

Ответ 1

Вы должны получить entrySet карты и приклеить записи к вызовам вашей двоичной функции:

inputMap.entrySet().stream().map(e->myFun(e.getKey(),e.getValue()));

Результат выше - поток экземпляров T.

Update

Ваш дополнительный пример подтверждает то, что обсуждалось в комментариях ниже: group by и sort относятся к их терминальным операциям. Они должны выполняться в полном объеме, чтобы иметь возможность создавать даже первый элемент вывода, поэтому включение их в качестве нетерминальных операций не покупает ничего с точки зрения производительности/памяти.

Бывает так, что Java 8 определяет sorted как нетерминальную операцию, однако это решение может привести к обманчивому коду, потому что операция будет блокироваться до тех пор, пока она не получит все восходящие элементы, и им придется сохранять их во время приема.