首页 > 解决方案 > 在分组时计算值中的元素按键中的属性

问题描述

我有一个Map<Owner, List<Car>>as ownerMap。我的Car班级有getColor()andgetPrice()方法。我的 Owner班级有 getCity() 方法。

我想按城市计算汽车的分组。(例如:布达佩斯:4(汽车))

到目前为止,这是我的代码:

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

标签: javadictionaryhashmapjava-stream

解决方案


你应该看看Collectors.groupingByand 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文档中:

返回一个收集器,对类型 T 的输入元素执行级联“分组依据”操作,根据分类函数对元素进行分组,然后使用指定的下游收集器对与给定键关联的值执行归约操作。

在您的情况下,分类功能是按城市(entry.getKey().getCity()),而您的归约操作是按键(entry.getValue().size())的 Cars 列表大小的总和。

已编辑修改以按城市获取汽车总和(列表大小)


推荐阅读