Подсчитать элементы в значениях при группировке по атрибуту в ключе - PullRequest
0 голосов
/ 22 января 2020

У меня есть Map<Owner, List<Car>> как ownerMap. Мой класс Car имеет методы getColor() и getPrice(). В моем классе Owner есть метод getCity ().

Я хочу посчитать группировку автомобилей по городам. (Например: Будапешт: 4 (машины))

Это мой код:

List<String> cities = ownerMap.entrySet()
                .stream()
                .map(m -> m.getKey().getCity())
                .distinct()
                .collect(Collectors.toList());

1 Ответ

2 голосов
/ 22 января 2020

Вы должны взглянуть на Collectors.groupingBy и Collectors.summingInt.

Например, что-то вроде:

Map<String, Integer> cities=ownerMap.entrySet()
            .stream()
            .collect(Collectors.groupingBy(e -> e.getKey().getCity(), Collectors.summingInt(e -> e.getValue().size())));

cities.forEach((name, count) -> {
        System.out.println(name + ":" + count);
    });

Из документации Collectors.groupingBy:

Возвращает Collector, реализующий каскадную операцию «group by» для элементов ввода типа T, группирует элементы в соответствии с функцией классификации, а затем выполняет операцию сокращения для значения, связанные с данным ключом с использованием указанного нисходящего коллектора.

В вашем случае функция классификации выполняется по городу (entry.getKey().getCity()), а операция сокращения представляет собой сумму размера списка автомобилей по ключу ( entry.getValue().size()).

РЕДАКТИРОВАНИЕ Изменено для получения суммы автомобилей (размер списка) по городам

...