Я хочу подсчитать различные элементы потока, и мне интересно, почему
Stream<String> stream = Stream.of("a", "b", "a", "c", "c", "a", "a", "d");
Map<String, Integer> counter1 = stream.collect(Collectors.toMap(s -> s, 1, Integer::sum));
не работает. Затмение говорит мне
Метод toMap(Function, Function, BinaryOperator) в типе Collectors неприменим для аргументов (( s) -> {}, int, Integer::sum)
Кстати, я знаю об этом решении:
Map<String, Long> counter2 = stream.collect(Collectors.groupingBy(s -> s, Collectors.counting()));
Итак, у меня есть два вопроса:
- В чем ошибка моего первого подхода?
- Как бы вы реализовали такой счетчик?
EDIT: я сам решил первый вопрос:
Map<String, Integer> counter1 = stream.collect(Collectors.toMap(s -> s, s -> 1, Integer::sum));
Java ожидает функцию в качестве второго аргумента.
Map<String, Integer>
, вы можете использовать.collect(groupingBy(s -> s, summingInt(s -> 1)));
, хотя подходcounting()
более удобочитаем. - person Alexis C.   schedule 26.05.2015