java - 使用 java 8 查找列表中不存在于另一个列表中的元素

标签 java lambda java-8 java-stream

我有 2 个列表。需求是根据条件过滤掉list1中不在list2中的元素。

  Class Fighter
  {
    String name;
    String address;
  }     
  List<Fighter> pairs1 = new ArrayList();
    pairs1.add(new Fighter("a", "a"));
    pairs1.add(new Fighter("b", "a"));

    List<Fighter> pairs2 = new ArrayList();
    pairs2.add(new Fighter("a", "c"));
    pairs2.add(new Fighter("a", "d"));
    Set<Fighter> finalValues = new HashSet<>();


    finalValues = pairs1.stream().filter(firstList -> 
   pairs2.stream().noneMatch(secondList -> 
   firstList.getName().equals(secondList.getName())
            && firstList.getName().equals(secondList.getName()))).collect(Collectors.toSet());

    System.out.println(finalValues);

预期输出:a=a, b=a

解释:list1 中的元素不在 list2 中

上面的代码没有给出预期的输出。请让我知道如何更正上述流代码以获得输出

最佳答案

首先重写 Fighter 类中的 equals 和 hashcode 方法。

@Override
public boolean equals(Object o) {
    if (o == this)
        return true;
    if (!(o instanceof Fighter))
        return false;
    Fighter f = (Fighter) o;
    return f.name.equals(name) && f.address.equals(address);
}

@Override
public int hashCode() {
    int result = name.hashCode();
    result = 31 * result + address.hashCode();
    return result;
}

然后从 pairs2 创建一个 Set。最后使用它的 contains 方法来获取集合差异。这是它的样子,

Set<Fighter> pairs2Set = new HashSet<>(pairs2);
Set<Fighter> setDiff = pairs1.stream()
    .filter(f -> !pairs2Set.contains(f))
    .collect(Collectors.toSet());

关于java - 使用 java 8 查找列表中不存在于另一个列表中的元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57621371/

相关文章:

java - Clojure REPL,互操作,无法解析符号

java - 每个帐户可以创建多少个 Flurry 项目?

java - 我们如何在 Android/java 中将新元素推送到 firestore Map 类型数组中?

c++ - 使用 Qt 在后台线程中定期执行某些 lambda func 的正确方法是什么?

java - 如何将此代码片段变形为逻辑取决于索引值的 Java 8?

java - 无法在基本类型 double 上调用 compareTo(double)

c++ - 使用 lambda 表达式作为 std::set 的比较,当它在 vector 中时

c# - 用表达式编写自己的断言函数

eclipse - Java 8 & 缺少所需的能力 Require-Capability : osgi. ee;过滤器 ="(&(osgi.ee=JavaSE)(version=1.8))"

gradle - 使用 gradle 导入 OSGI com.sun.image