首页 > 解决方案 > 地图列表按某个键分组并汇总

问题描述

我想列出一个按某个键分组和汇总的地图列表。

List<Tag> tagList = new ArrayList<>();

# Tag
HashMap<String, Object> tagMap = new HashMap<>();

## feeding data example
tagMap.put("category", "A");
tagMap.put("name", "Apple");
tagMap.put("price", 10);

tagList.add(tagMap)

tagList = 
    [
      {
        "category": "A",
        "name": "apple",
        "price": 10
      },
      {
        "category": "B",
        "name": "banana",
        "price": 20
      },
      {
        "category": "C",
        "name": "candy",
        "price": 30
      },
      {
        "category": "A",
        "name": "apple",
        "price": 20
      },
      {
        "category": "B",
        "name": "banana",
        "price": 10
      },
      {
        "category": "C",
        "name": "candy",
        "price": 20
      }
    ]

我已经分组tagListcategory

Map<String, List<Tag>> tagGrouped =
       tagList.stream()
       .collect(Collectors.groupingBy(tag -> tag.getCategory()));

这是示例

Map<String, List<Tag>> tagGrouped =

        {
          "A": [
            {
              "category": "A",
              "name": "apple",
              "price": 10
            },
            {
              "category": "A",
              "name": "apple",
              "price": 20
            },
            {
              "category": "A",
              "name": "apple",
              "price": 30
            }
          ],
          "B": [
            {
              "category": "B",
              "name": "banana",
              "price": 10
            },
            {
              "category": "B",
              "name": "banana",
              "price": 20
            }
          ],
          "C": [
            {
              "category": "C",
              "name": "candy",
              "price": 10
            },
            {
              "category": "C",
              "name": "candy",
              "price": 10
            },
            {
              "category": "C",
              "name": "candy",
              "price": 20
            }
          ]
    }

这是我最终想要得到的示例输出

tagGroupedList = 
    [
      {
        "category": "A",
        "name": "apple",
        "price": 60
      },
      {
        "category": "B",
        "name": "banana",
        "price": 30
      },
      {
        "category": "C",
        "name": "candy",
        "price": 40
      }
    ]

我在这一点上卡住了..

List<Tag> tagGroupedList =
                tagGrouped.stream()
                .collect(Collectors.groupingBy(Tag::getCategory))
                .entrySet()
                .stream()
                .flatMap(e -> e.getValue().stream())
                .collect(Collectors.summarizingInt(Tag::getPrice));

标签: java

解决方案


最好阅读官方文档,刷新自己的地图知识。 https://docs.oracle.com/javase/tutorial/collections/interfaces/map.html


推荐阅读