shr*_*eya 5 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);
Run Code Online (Sandbox Code Playgroud)
预期输出:a=a, b=a
说明:list1 中的元素不在 list2 中
上面的代码没有给出预期的输出。请让我知道如何更正上述流代码以获得输出
在过滤器内部匹配时不使用地址。
List<Fighter> res = pairs1.stream()
.filter(f -> !pairs2.stream()
.anyMatch(s -> f.getName().equals(s.getName())
&& f.getAddress().equals(s.getAddress())))
.collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)
这里根据条件过滤第二个列表中是否包含第一个列表的元素。
更好的方法:
使用列表的 contains 方法
List<Fighter> res = pairs1.stream()
.filter(e -> !pairs2.contains(e))
.collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)
您需要重写equals()Fighter 类中的方法。contains()方法 您将使用该equals()方法来评估两个对象是否相同。
@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);
}
Run Code Online (Sandbox Code Playgroud)
但使用Set会更快一些。使用 Set查看类似问题解决方案
首先覆盖 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;
}
Run Code Online (Sandbox Code Playgroud)
然后从pairs2创建一个集合。最后使用它的 contains 方法来获取集差。这是它的样子,
Set<Fighter> pairs2Set = new HashSet<>(pairs2);
Set<Fighter> setDiff = pairs1.stream()
.filter(f -> !pairs2Set.contains(f))
.collect(Collectors.toSet());
Run Code Online (Sandbox Code Playgroud)