使用Java8流API合并两个hashmap列表
我有两个使用Java8流API合并两个hashmap列表,java,collections,java-8,java-stream,Java,Collections,Java 8,Java Stream,我有两个列表HashMap: List<HashMap<String,String>> a = new ArrayList<HashMap<String,String>>(); List<HashMap<String,String>> b = new ArrayList<HashMap<String,String>>(); 我想合并这两个列表s,并使用具有以下输出的流API生成一个最终的列表(Has
列表HashMap
:
List<HashMap<String,String>> a = new ArrayList<HashMap<String,String>>();
List<HashMap<String,String>> b = new ArrayList<HashMap<String,String>>();
我想合并这两个列表
s,并使用具有以下输出的流API生成一个最终的列表
(HashMap
):
c = [{a1=1, b1=2, c=3, d1=7},{a2=4, b2=5, c=6, d2=8}]
有什么帮助吗?如果您根据列表
s'索引合并它们,并且两个列表
s的长度相同,您可以写:
IntStream.range(0,a.size()).forEach(i->a.get(i).putAll(b.get(i)));
这将导致包含合并结果的列表a
如果要生成新的列表
而不改变原始的列表
s,可以创建新的哈希映射
s并将其收集到新的列表
:
List<HashMap<String,String>> c =
IntStream.range(0,a.size())
.mapToObj(i -> {
HashMap<String,String> hm = new HashMap<>(a.get(i));
hm.putAll(b.get(i));
return hm;
})
.collect(Collectors.toList());
列表c=
IntStream.range(0,a.size())
.mapToObj(i->{
HashMap hm=新的HashMap(a.get(i));
hm.putAll(b.get(i));
返回hm;
})
.collect(Collectors.toList());
编辑更新后的问题:
List<HashMap<String,String>> c =
a.stream ()
.map(am -> {
HashMap<String,String> hm = new HashMap<>(am);
HashMap<String,String> second =
b.stream()
.filter (bm -> bm.get ("c") != null && bm.get ("c").equals (am.get ("c")))
.findFirst()
.orElse(null);
if (second != null) {
hm.putAll (second);
}
return hm;
})
.collect(Collectors.toList());
列表c=
a、 流()
.map(上午->{
HashMap hm=新的HashMap(am);
哈希映射秒=
b、 流()
.filter(bm->bm.get(“c”)!=null&&bm.get(“c”)。等于(am.get(“c”))
.findFirst()
.orElse(空);
if(秒!=null){
普托尔先生(第二);
}
返回hm;
})
.collect(Collectors.toList());
现在,我们对第一个列表的元素进行流式处理,对于每个HashMap
,搜索第二个列表的相应HashMap
像这样试试。为了简化它,我定义了一个双函数
BiFunction<HashMap<String, String>, List<HashMap<String, String>>, HashMap<String, String>> biFunction =
(m1, listOfMap) -> {
HashMap<String, String> result = new HashMap<>(m1);
listOfMap.forEach(item -> {
if (item.containsKey("c")&& item.get("c").equals(result.get("c")))
result.putAll(item);
});
return result;
};
有时流API不是答案。在这种情况下,常规循环将更具可读性和可维护性。您甚至可以在循环中添加注释,以解释它为什么会执行某些操作,而不会使代码不可读。流API使平凡的事情变得非常简单,使复杂的事情变得更加复杂
除非它是一个家庭作业,在这种情况下,它是一个愚蠢的家庭作业。学校作业不应该鼓励学生在错误的地方使用愚蠢的结构
在现实世界中,可读性和可维护性对于行数或聪明度分数至关重要。如果有冲突怎么办?我想在键“c”上合并内部哈希映射。请参阅我的最新问题。你能帮帮我吗?@AnitaPatel这是否意味着,例如,列表a中的第一个HashMap可以与列表b中的第二个HashMap合并?是的。列表a中的第一个HashMap可以通过具有相同值的键“c”与列表b中的第二个HashMap合并。@AnitaPatel,如果同一列表中的多个HashMap对键“c”具有相同值,该怎么办?数据有保证。那件事不会引起争论。
BiFunction<HashMap<String, String>, List<HashMap<String, String>>, HashMap<String, String>> biFunction =
(m1, listOfMap) -> {
HashMap<String, String> result = new HashMap<>(m1);
listOfMap.forEach(item -> {
if (item.containsKey("c")&& item.get("c").equals(result.get("c")))
result.putAll(item);
});
return result;
};
IntStream.range(0, list.size())
.mapToObj(i -> biFunction.apply(list.get(i), list2))
.collect(Collectors.toList());