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

发布于 2025-01-14 10:53:26 字数 371 浏览 4 评论 0原文

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

public class Person {

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

}

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

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

I have two lists (List1 and List2) of Person objects:

public class Person {

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

}

I want to compare the Lists, and wherever there is a match on id, I want to check if the age matches. If age does match, then I don't want to do anything but if there is a mismatch in age then I want to return the names.

So I should end up with one Set (no duplicates) that contains names from all the objects that has ids in both lists but a mismatch in age.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

不及他 2025-01-21 10:53:26

您可以过滤这两个列表,将它们连接起来并平面映射到名称。像这样的东西:

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());

You could filter both lists, concatnate them and flatmap to the names. Something like:

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());
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文