По сути, то, что вы делаете, называется «группировкой» на основе любимого цвета.
Вот еще один подход:
Map<String, Integer> result =
studentList.stream()
.collect(toMap(Student::getFavouriteColor, s -> 1, Math::addExact));
При этом используется коллектор toMap
, гдеkeyMapper
- это Student::getFavouriteColor
, то есть функция, извлекающая любимый цвет студентов в качестве ключа карты.
Во-вторых, мы помещаем valueMapper
функцию s -> 1
, то есть функцию, принимающую Student
и возвращающую 1
в качестве значения карты.
Наконец, мы предоставляем функцию «слияния» Math::addExact
, которая используется для добавления двух соответствующих значений при наличии ключевого столкновения на основе избранного цвета.
Таким образом, в результате у нас будет карта из String
---> Integer
, где каждая запись на карте представляет цвет и количество раз, когда этот цвет был выбран в качестве «любимого цвета» среди учащихся.'list.
Кроме того, если вы хотите распечатать этот результат в порядке возрастания на основе вхождений, вы можете отсортировать результат и распечатать его следующим образом:
studentList.stream()
.collect(toMap(Student::getFavouriteColor, s -> 1, Math::addExact))
.entrySet()
.stream()
.sorted(Map.Entry.comparingByValue())
.forEachOrdered(e -> System.out.println(e.getKey() + ":" + e.getValue()));
необходим импорт:
import java.util.stream.*;
import static java.util.stream.Collectors.*;