【问题标题】:Merging two list of hashmap using Java8 Stream API使用 Java8 Stream API 合并两个 hashmap 列表
【发布时间】:2018-08-09 05:29:10
【问题描述】:

我有两个Lists 和HashMap

List<HashMap<String,String>> a = new ArrayList<HashMap<String,String>>();
List<HashMap<String,String>> b = new ArrayList<HashMap<String,String>>();

样本数据:

a = [{a1=1, b1=2, c=3},{a2=4, b2=5, c=6}]
b = [{d1=7,c=3},{d2=8,c=6}]

我想合并两个 Lists 并使用具有输出的 Stream API 获得 HashMap 的最终 List

c = [{a1=1, b1=2, c=3, d1=7},{a2=4, b2=5, c=6, d2=8}]

有什么帮助吗?

【问题讨论】:

  • 如果有冲突怎么办?

标签: java collections java-8 java-stream


【解决方案1】:

有时 Stream API 不是答案。在这种情况下,常规循环将更具可读性和可维护性。您甚至可以在循环中添加 cmets 来解释它为什么会做某事而不会使代码不可读。 Stream API 让平凡的事情变得非常简单,让复杂的事情变得更加复杂。

除非这是一个家庭作业,在这种情况下它是一个愚蠢的家庭作业。学校作业不应该鼓励学生在错误的地方使用愚蠢的结构。

在现实世界中,可读性和可维护性对于行数或智能得分至关重要。

【讨论】:

    【解决方案2】:

    如果按照Lists'索引合并,两个Lists长度相同,可以这样写:

    IntStream.range(0,a.size()).forEach(i->a.get(i).putAll(b.get(i)));
    

    这将导致 List a 包含合并结果。

    如果你想产生一个新的List而不改变原来的Lists,你可以创建一个新的HashMaps并将它们收集到一个新的List

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

    编辑更新的问题:

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

    现在我们对第一个List 的元素进行流式传输,并为每个HashMap 搜索第二个List 的对应HashMap

    【讨论】:

    • 我想在键“c”上合并内部哈希图。请参阅我更新的问题。你能帮帮我吗?
    • @AnitaPatel 是否意味着,例如,列表 a 中的第一个 HashMap 可以与列表 b 中的第二个 HashMap 合并?
    • 是的。列表 a 中的第一个 HashMap 可以通过具有相同值的键“c”与列表 b 中的第二个 HashMap 合并。
    • @AnitaPatel 如果同一个列表的多个 HashMap 的键“c”具有相同的值怎么办?
    • 数据有保证。这种情况不会发生。
    【解决方案3】:

    试试这样。为了简化它,我定义了一个 Bifunction。

    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;
                };
    

    然后合并使用此 BiFunction 来合并列表项。

    IntStream.range(0, list.size())
                .mapToObj(i -> biFunction.apply(list.get(i), list2))
                .collect(Collectors.toList());
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-12
      • 2014-05-27
      • 1970-01-01
      • 2019-12-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多