首页 > 解决方案 > 按列表值分组并查找列表中使用的元素总数

问题描述

我有一个List<<Map<String, Object>>在 List 中包含以下值: Map<String, Object> 包含两个键 resourceName 和 tableName ,如下图所示:

Map<String, Object> m1 = new HashMap<>();
m1.put("resourceName", "Pt");
m1.put("tableName", "Tb1");

Map<String, Object> m2 = new HashMap<>();
m2.put("resourceName", "Pt");
m2.put("tableName", "Tb2");

Map<String, Object> m3 = new HashMap<>();
m3.put("resourceName", "Enc");
m3.put("tableName", "Enctab1");

我想要如下所述的输出(即,每个资源的表名数:)

[铂,2] [编码,1]

标签: javacollectionsjava-8java-stream

解决方案


似乎以下几点在这里很重要:

  1. "resourceName"通过地图中的特定键选择和计数条目,
  2. Map.Entry通过转换为 String来表示所需格式的输出
String result = list.stream()
    .map(m -> m.get("resourceName")) // retrieve specific 'field' from map
    .collect(Collectors.groupingBy(  // calculate frequency of values
        name -> name, 
        Collectors.summingInt(name -> 1)
    ))
    .entrySet().stream()
    .map(e -> Arrays.toString(new Object[]{e.getKey(), e.getValue()}))
    .collect(Collectors.joining());
System.out.println(result);

输出:

[Pt, 2][Enc, 1]

推荐阅读