如何制作一个高级流,同时匹配和比较不匹配的情况?

问题描述 投票:0回答:1

我有两个 Person 对象列表(List1List2):

public class Person {

  ObjectId id;
  private List<String> names;
  private Integer age;

}

我想比较列表,只要 id 匹配,我想检查年龄是否匹配。如果年龄确实匹配,那么我不想做任何事情,但如果年龄不匹配,那么我想返回姓名。

所以我最终应该得到一个集合(无重复),其中包含所有对象的名称,这些对象在两个列表中都有 id,但年龄不匹配。

java list set java-stream
1个回答
0
投票

您可以过滤两个列表,将它们连接起来并平面映射到名称。比如:

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());
最新问题
© www.soinside.com 2019 - 2024. All rights reserved.