Сбор вхождений в HashMap с потоками - PullRequest
0 голосов
/ 04 января 2019

Мне нужно решить упражнение. У меня есть класс Fox, в котором есть поля имени и цвета. Мое упражнение - найти частоту лисиц по цвету.

Таким образом, я создал HashMap, где атрибут String будет именем лисы, а Integer будет самим вхождением:

    Map<String, Integer> freq = new HashMap<>();

Сделав это, я пытался написать код с потоками, но я изо всех сил пытаюсь это сделать. Я написал что-то вроде этого:

    foxes.stream()
    .map(Fox::getColor)
    .forEach()
    //...(continued later on);

, где лисы - это список.

Моя проблема в основном с синтаксисом. Я хотел бы сделать что-то, что если у цвета нет вхождений, то

    freq.put(Fox::getName, 1)

еще

    freq.replace(Fox::getName, freq.get(Fox::getName) + 1)

Как мне это собрать?

1 Ответ

0 голосов
/ 04 января 2019

Я бы не советовал продолжать ваш подход просто потому, что для этого уже есть встроенный коллектор, т.е. groupingBy коллектор с counting() в качестве нисходящего потока:

 Map<String, Long> result = foxes.stream()
      .collect(Collectors.groupingBy(Fox::getName, Collectors.counting()));

Он находит частоту по «имени», аналогично, вы можете получить частоту по цвету, изменив классификационную функцию.

foxes.stream()
     .collect(Collectors.groupingBy(Fox::getColor, Collectors.counting()));
...