从映射列表java8中合并映射



各位开发者好,需要您在以下问题上的专业知识我有一个下面的地图传入列表

Map<String, Object> m1 = new HashMap<String, Object>();
m1.put("name", "alex");
m1.put("age", "40");
l1.add(m1);
m1 = new HashMap<String, Object>();
m1.put("name", "alex");
m1.put("state", "Texas");
l1.add(m1);
m1 = new HashMap<String, Object>();
m1.put("name", "alice");
m1.put("age", "35");
l1.add(m1);
m1 = new HashMap<String, Object>();
m1.put("name", "alice");
m1.put("state", "Arizona");
l1.add(m1);
m1 = new HashMap<String, Object>();
m1.put("name", "bob");
m1.put("age", "25");
l1.add(m1);
m1 = new HashMap<String, Object>();
m1.put("name", "bob");
m1.put("state", "Utah");
l1.add(m1);

我想要使用java8streams-的地图输出列表如下

[{name="alex", age="40", state="Texas"}
{name="alice", age="35", state="Arizona"}
{name="bob", age="25", state="Utah"}]

感谢您的帮助。

您可以使用带有合并功能的toMap()收集器。

l1.stream()
.collect(Collectors.toMap(m -> m.get("name").toString(), Function.identity(),
(map1, map2) -> { map1.putAll(map2); return map1;})
)
.values();

事实上,在这个解决方案中,我们基于名称键值合并映射。因此,如果两个映射的name键的值相同,那么它们将合并。由于toMap((收集器的结果在这里是Map<String,Map<String,Object>>,而期望的结果是Map<String,Object>,所以我们称之为values()

最新更新