如何制作既匹配又比较不匹配的高级流?
How do I make an advanced stream that both matches and compares where no match at the same time?
我有两个列表(List1 和 List2) 的 Person 对象:
public class Person {
ObjectId id;
private List<String> names;
private Integer age;
}
我想比较列表,如果id匹配,我想检查年龄是否匹配。如果年龄确实匹配,那么我不想做任何事情,但如果年龄不匹配,那么我想 return 名字。
所以我最终应该得到一个 集合(无重复项),其中包含所有在两个列表中都有 ID 但年龄不匹配的对象的名称。
您可以过滤这两个列表,将它们连接起来并将平面图映射到指定的列表。类似于:
import java.util.List;
import java.util.Objects;
import java.util.Set;
import java.util.function.BiPredicate;
import java.util.stream.Collectors;
import java.util.stream.Stream;
....
List<Person> list1 = //your first list
List<Person> list2 = //your second list
BiPredicate<Person,Person> sameIdDiffAge = (p1,p2) -> Objects.equals(p1.getId(), p2.getId()) &&
!Objects.equals(p1.getAge(), p2.getAge());
Set<String> result =
Stream.concat(list1.stream().filter(p1 -> list2.stream().anyMatch(p2 -> sameIdDiffAge.test(p1,p2))),
list2.stream().filter(p1 -> list1.stream().anyMatch(p2 -> sameIdDiffAge.test(p1,p2))))
.flatMap(p -> p.getNames().stream())
.collect(Collectors.toSet());
我有两个列表(List1 和 List2) 的 Person 对象:
public class Person {
ObjectId id;
private List<String> names;
private Integer age;
}
我想比较列表,如果id匹配,我想检查年龄是否匹配。如果年龄确实匹配,那么我不想做任何事情,但如果年龄不匹配,那么我想 return 名字。
所以我最终应该得到一个 集合(无重复项),其中包含所有在两个列表中都有 ID 但年龄不匹配的对象的名称。
您可以过滤这两个列表,将它们连接起来并将平面图映射到指定的列表。类似于:
import java.util.List;
import java.util.Objects;
import java.util.Set;
import java.util.function.BiPredicate;
import java.util.stream.Collectors;
import java.util.stream.Stream;
....
List<Person> list1 = //your first list
List<Person> list2 = //your second list
BiPredicate<Person,Person> sameIdDiffAge = (p1,p2) -> Objects.equals(p1.getId(), p2.getId()) &&
!Objects.equals(p1.getAge(), p2.getAge());
Set<String> result =
Stream.concat(list1.stream().filter(p1 -> list2.stream().anyMatch(p2 -> sameIdDiffAge.test(p1,p2))),
list2.stream().filter(p1 -> list1.stream().anyMatch(p2 -> sameIdDiffAge.test(p1,p2))))
.flatMap(p -> p.getNames().stream())
.collect(Collectors.toSet());