我有2个 list 。要求是根据条件过滤掉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创建一个集合。最后使用它的contains方法来获取设置差异。这是它的样子,
Set<Fighter> pairs2Set = new HashSet<>(pairs2);
Set<Fighter> setDiff = pairs1.stream()
    .filter(f -> !pairs2Set.contains(f))
    .collect(Collectors.toSet());

09-27 18:05