【发布时间】:2020-10-04 23:08:43
【问题描述】:
我有一个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 分组,并且在同一 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())
对此问题的一些附加评论:
我使用 for LOOP 解决了这个问题,但是当列表大小约为 50000 时应用程序挂起,因此我寻求一种性能更好的方法来执行此操作。据我所知,Java 8 流平面图可能是一种方式。 因此,关键点不仅在于重新映射,还在于以最高效的方式来实现这一点。
【问题讨论】:
-
我对您的预期结果有疑问,您真的希望日期键和日期值与您的值在同一个映射中吗?为什么你不能有一个
Map<String, List<Map<String, String>>,其中第一张地图的键是日期,而List<Map<>>是你的实际值? -
我还要问,为什么你需要用 java 8 流来做这个?我怀疑它的性能会更好,而且您肯定可以通过手动滚动代码的步骤以更易读的方式做到这一点。
-
@BeUndead 不确定为什么您认为 Java 8 解决方案不可读。也许不是那么高效。但绝对不是丑陋的代码。
-
@scigs,其实列表确实是我期望的回报,而不是地图
-
@SilviuBurcea,已经这样做了。我刚从一个严重的问题中回来。抱歉回复晚了。
标签: java java-8 java-stream collectors groupingby