使用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());