【问题标题】:Merging two list of objects but removing duplicate on the basis of id field合并两个对象列表,但根据 id 字段删除重复项
【发布时间】:2020-04-23 10:46:33
【问题描述】:

我有两个对象客户列表。一个列表代表订阅了 XYZ 和另一个订阅 ABC 包的客户。我想合并这两个列表,但是如果两个列表中有任何具有相同 id 的客户,我想更新一个它订阅两个包的标志。例如。如果包是 XYZ,flag 为 1,如果 ABC 为 2,如果两者都为 3。如何使用 java 流来做到这一点? 我尝试使用以下内容,但它只给了我一个常见的列表。

List<FindCustomer> filteredList = xyzPackage.stream()
          .filter(sh -> abcPackage.stream()
            .anyMatch(sp -> 
              sh.getId().equals(sp.getId())))
            .collect(Collectors.toList()); 

【问题讨论】:

    标签: java arrays oop java-8 java-stream


    【解决方案1】:

    这个想法是按 id 对订阅进行分组。当发现重复时,通过更新订阅标志来“合并”结果。最后一步是将Map#values() 作为列表返回:

    List<FindCustomer> concatenatedSubscriptions = Stream.concat(subscriptionABC.stream(), subscriptionXYZ.stream())
        .collect(Collectors.collectingAndThen(Collectors.toMap(FindCustomer::getId, Function.identity(), (c1, c2) -> {
          if (c1.getFlag() != c2.getFlag) {
            c1.setFlag(3);
          }
          return c1;
        }), map ->  new ArrayList<>(map.values())));
    

    【讨论】:

    • 这对我有用。非常感谢。只是一个逻辑上理解这一点的问题,这个 IF CHECK 在这里如何工作?
    • 如果 c1 和 c2 不同(即 [1, 2], [2, 1], [2, 3], [3, 2], [3, 1], [1, 3] ) 然后标志设置为 3 否则它将保留。
    • 非常感谢您的澄清。
    猜你喜欢
    • 2019-08-09
    • 1970-01-01
    • 1970-01-01
    • 2021-11-23
    • 2017-06-05
    • 1970-01-01
    • 2010-11-22
    • 1970-01-01
    • 2015-11-29
    相关资源
    最近更新 更多