我有一个 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 map,该map按日期分组,同一日期中的所有条目集将被放在一起,例如:
[{"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())
针对此问题的一些额外评论:
我使用了 for 循环来解决这个问题,但当列表大小达到约 50000 时,应用程序会挂起,因此我寻求更好的性能方法。据我所知,Java 8 流 flat map 可能是一种方式。 因此,关键点不仅在于重新映射,还要以最高效的方式完成。
Map<String, List<Map<String, String>>
,其中第一个映射以日期为键,而List<Map<>>
是您的实际值? - scigsFunction<Map<String, String>> classifier = (map) -> map.get("date");
并使用Collectors.groupingBy(classifier, ...)
而不是内联它。我同意有些 lambda 代码在第一次阅读时不太容易理解,但如果你之前看过 lambda 代码,所有的解决方案都很好。你不能比这更简单了,我认为循环也做不到更好。 - Silviu Burcea