java - 从相同对象的两个列表中仅查找不匹配的 ID

标签 java java-8 java-stream

我需要从两个不匹配 id 的对象列表创建一个 id 列表

我可以用旧方法来做,但希望使用 java 8 来完成

这就是我所做的并且有效。 (为上下文提供此内容的实际代码)

private List<String> getCartItemAttributesIds(List<CartItemAttribute> existingAttributes, List<CartItemAttribute> requestingAttributes) {
        List<String> attributeIdsNeededtoDeleted = new ArrayList<>();
        boolean flag = true;
        for(CartItemAttribute existingAttribute: existingAttributes) {
            flag = true;
            for(CartItemAttribute requestingAttribute:requestingAttributes) {
                if(StringUtils.isBlank(requestingAttribute.getCartItemAttributeId())) { 
                    flag = false;
                    break; 

                } else if (requestingAttribute.getCartItemAttributeId().equals(existingAttribute.getCartItemAttributeId())) {
                    flag = false;
                    break;
                }
            }
            if(flag) {
                attributeIdsNeededtoDeleted.add(existingAttribute.getCartItemAttributeId());
            }
        }

        System.out.println("*********************************");
        for (String var: attributeIdsNeededtoDeleted) {
            System.out.println("[" +var +"]");
        }

        return attributeIdsNeededtoDeleted;

    }
class Person {
    String id ;
    String name;
    String age;
}
p1:{1,test1,3}
p11:{12,test4,9} <----
p2:{2,test2,6}
p3:{6,test3,8} <----
p4:{1,test1,33}
p5:{2,test22,16}
p6:{3,test3,18}
p10:{null,test10,8}

List<Person> list1 = {p1,p2, p3,p11};
List<Person> list2 = {p4,p5, p6, p10}; 

结果

list<string> results = {"p11","p3"}

对结果的详细解释:

p1:{1,test1,3}
p4:{1,test1,33}
p2:{2,test2,6}
p5:{2,test22,16}

p1 和 p4, p2 和 p5

他们的 id 匹配,即使数据不匹配,但我不希望结果中有这个 id

p6:{3,test3,18}
p10:{null,test10,8}

p6 和 p10 不匹配,但它们都在列表 2 中,因此不希望它们出现在我的结果列表中。

p11:{12,test4,9} <----
p3:{6,test3,8} <----

p11 和 p3。 ID 在列表 1 中而不在列表 2 中,因此它们不匹配,应该在结果列表中。

我想使用流。并且模型哈希码包含所有字段,“包含”或“设置”会认为它们是不同的对象。但就我的目的而言,只有没有匹配的 ID 才会有所不同。

最佳答案

如果您不想按照建议使用Set 类,您可以这样做。我向 Person 类以及 equalshashCode 实现添加了一个额外的字段。但是你现在所做的并没有错。恕我直言,streams 是为了让您的编码更轻松,而不是将特定的实现技术强加给您。


   public static void main(String[] args) {
      Person p1 = new Person("1", "test1", "3", "p1");
      Person p11 = new Person("12", "test4", "9", "p11");
      Person p2 = new Person("2", "test2", "6", "p2");
      Person p3 = new Person("6", "test3", "8", "p3");
      Person p4 = new Person("1", "test1", "33", "p4");
      Person p5 = new Person("2", "test22", "16", "p5");
      Person p6 = new Person("3", "test3", "18", "p6");
      Person p10 = new Person(null, "test10", "8", "p10");

      List<Person> list1 = Arrays.asList(p1, p2, p3, p11);
      List<Person> list2 = Arrays.asList(p4, p5, p6, p10);

      List<Person> result =
            list1.stream().filter(n -> !list2.contains(n)).collect(
                  Collectors.toList());
      System.out.println(result);

   }

}

class Person {
   String id;
   String name;
   String age;
   String fieldName;

   public int hashCode() {
      return id.hashCode();
   }
   public boolean equals(Object ob) {
      if (ob == this) {
         return true;
      }
      if (!(ob instanceof Person)) {
         return false;
      }

      Person p = (Person) ob;
      if (p.id == null && id == null) {
         return true;
      }
      if (p.id == null || id == null) {
         return false;
      }
      return id.equals(p.id);
   }
   public Person(String id, String name, String age, String fieldName) {
      this.id = id;
      this.name = name;
      this.age = age;
      this.fieldName = fieldName;
   }
   public String toString() {
      return fieldName;
   }
}

为了完成,这里是评论中提到的 Set 解决方案。


      Set<Person> set1 = new HashSet<>(list1);
      set1.removeAll(list2);
      System.out.println(set1);

关于java - 从相同对象的两个列表中仅查找不匹配的 ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57528189/

相关文章:

java - 使用监听器捕获 Spring Batch 中步骤中的错误

Spring 的 @Condtional 注解与 Java 8

Java - 错误 : A JNI error has occurred, ... 在线程 "main"java.lang.UnsupportedClassVersionError 中:

Java 8 流多线程

java - java入门问题

java - hadoop pathFilter无法过​​滤给定路径

java - 接口(interface)实现

java-8 - Findbugs 3.0.0 FINAL 什么时候发布?

java - 通过Java Stream实现多个集合的笛卡尔积

java - 关闭正在处理 Stream 的 ExecutorService