Java 8 流将 ListMap>> 通过相同的 Key, Value> 分组到新的 ListMap>>

birdshome 阅读:23 2024-09-07 23:24:14 评论:0

我有一个 List<Map<String,String>>如:

Map<String, String> m1 = new HashMap<>(); 
m1.put("date", "2020.1.5"); 
m1.put("B", "10"); 
 
Map<String, String> m2 = new HashMap<>(); 
m2.put("date", "2020.1.5"); 
m2.put("A", "20"); 
 
Map<String, String> m3 = new HashMap<>(); 
m3.put("date", "2020.1.6"); 
m3.put("A", "30"); 
 
Map<String, String> m4 = new HashMap<>(); 
m4.put("date", "2020.1.7"); 
m4.put("C", "30"); 
 
List<Map<String, String>> before = new ArrayList<>(); 
before.add(m1); 
before.add(m2); 
before.add(m3); 
before.add(m4); 
我期望的结果是生成一个新的 List 映射,它按 date 分组,并将同一日期中设置的所有条目放在一起,例如:
[{"A":"20","B":"10","date":"2020.1.5"},{"A":"30","date":"2020.1.6"},{"C":"30","date":"2020.1.7"}] 
我尝试了以下方法,但始终不是我期望的结果。
stream().flatmap().collect(Collectors.groupingBy()) 
此问题的一些附加评论:
我为 LOOP 解决了这个问题,但是当列表大小大约为 50000 时应用程序挂起,所以我寻求一种更好的性能方法来做到这一点。据我所知,Java 8 流平面 map 可能是一种方式。
所以关键不仅是重新映射这个,而且是用最高效的方式来做到这一点。

请您参考如下方法:

before 
  .stream() 
  .collect(Collectors.toMap((m) -> m.get("date"), m -> m, (a,b) -> { 
      Map<String, String> res = new HashMap<>(); 
      res.putAll(a); 
      res.putAll(b); 
      return res; 
  })) 
  .values(); 
这是您正在寻找的解决方案。 toMap函数接收 3 个参数:
  • 键映射器,在您的情况下是日期
  • 值映射器,即正在处理的映射本身
  • 合并函数,它采用 2 个具有相同日期的映射并将所有键放在一起

  • 输出:
    [{date=2020.1.5, A=20, B=10}, {date=2020.1.6, A=30}, {date=2020.1.7, C=30}] 
    


    标签:java
    声明

    1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

    关注我们

    一个IT知识分享的公众号