在 Java 8 中创建嵌套父子列表

2024-01-30

我是 Java 8 的新手,需要解决以下问题。

我有两个课程如下:

class Person {
    String name;
    int age;
    List<Address> address;
}

class Address {
    String street;
    String city;
    String country;
}

现在我有一个来自数据库的列表,如下所示:

List<Person> findPerson;

adam
26
<123, xyz, yyy>

adam
26
<456, rrr, kkk>

bill
31
<666, uuu, hhh>

现在我需要将相同的人员对象与不同的地址对象组合在一起,如下所示?

List<Person> findPerson;

adam
26
<123, xyz, 456>
<456, rrr, 123>

bill
31
<666, uuu, 999>

如何在 Java 8 流中完成此操作?


我建议你实施equals and hashcode在你的Person class.

Example:

@Override
public boolean equals(Object o) {
       if (this == o) return true;
       if (o == null || getClass() != o.getClass()) return false;

       Person person = (Person) o;

       if (age != person.age) return false;
       return name != null ? name.equals(person.name) : person.name == null;
}

@Override
public int hashCode() {
       int result = name != null ? name.hashCode() : 0;
       result = 31 * result + age;
       return result;
}

那么你可以有一个Map<Person, List<Address>>作为结果集的接收者类型。

Map<Person, List<Address>> resultSet = findPerson.stream()
    .collect(
        Collectors.groupingBy(
            Function.identity(),
            Collectors.flatMapping(
                p -> p.getAddress().stream(), 
                Collectors.toList()
            )
        )
    )
;

该解决方案利用了flatMapping收集器仅在 Java-9 中可用。

如果你仍在使用 Java-8 那么你可以这样做:

Map<Person, List<Address>> resultSet = findPerson.stream()
    .collect(
        Collectors.groupingBy(
            Function.identity(),
            Collectors.collectingAndThen(
                Collectors.mapping(
                    Person::getAddress, 
                    Collectors.toList()
                ),
                lists -> lists.stream()
                    .flatMap(List::stream)
                    .collect( Collectors.toList() )
            )
        )
    )   
;

note- 事实上,我目前假设两个或更多人被认为是平等的name and age,但是,如果仅基于name或者只是age那么你需要调整equals / hashcode方法一点点。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Java 8 中创建嵌套父子列表 的相关文章

随机推荐

  • Nodejs http 超时或错误时重试

    我正在尝试在超时或错误时自动重试 HTTP 请求 目前我的代码如下所示 var req http get url doStuff on error retry setTimeout 10000 retry 但是 单个请求有时可能会同时触发
  • 如何对通知进行android单元测试?

    我有课handleFirebaseMessages 它包含以下功能onMessageReceived 该函数负责接收数据并创建通知 onMessageReceived 接收数据在RemoteMessages目的 我正在尝试为这个函数编写一个
  • 引起原因:java.sql.SQLException:不支持 JDBC4 Connection.isValid() 方法

    我的 play framework 项目在本地运行良好 但是当我尝试将其部署到 heroku 中时 出现以下错误 2015 07 05T06 24 10 456657 00 00 app web 1 at com google inject
  • 默认样式表、用户样式表和作者样式表之间有什么区别?

    In CSS http en wikipedia org wiki Cascading Style Sheets 有什么区别default user and author样式表 默认样式表由浏览器供应商提供 用户样式表由浏览器的用户提供 作
  • 将数据从 SQL Server 加载到 Excel 的最快方法

    我在 SQL Server 上有一个相对较大的表 大约 300 000 行 该数据用作数据池来验证用户在 Excel 电子表格中执行的操作 确保用户始终使用最新数据的一种方法是设置 VBA 以便在电子表格打开时自动从 SQL Server
  • .NET 可移植类库和 UDP 支持

    我正在为 Philips Hue Lights 编写一个 C 库 我正在尝试在 NET 可移植集中编写基本 API 包装器 这样我就可以在 Windows 8 RT WP 等各种平台上重复使用该库 API 本身完全通过 HTTP 使用 RE
  • Travis CI/Pro:CIDR/IP 范围?

    我们正在使用 Travis Pro 并对 Redshift 进行了一些测试 我们可以在 Redshift 中为其创建安全规则吗 Travis VM 是否有 CIDR IP 范围 显然我们不会为任何传入 IP 打开 Redshift 这在过去
  • 如何在 Rails 3 中使用 Ransack 范围?

    在我的小部件模型中 我有以下内容 scope accessible to lambda user if user has role admin self all else roles user roles role ids roles ea
  • 如何中断BufferedReader readLine

    我正在尝试在多个线程中逐行读取套接字的输入 我怎样才能打断readLine 这样我就可以优雅地停止它正在阻塞的线程 编辑 赏金 可以在不关闭套接字的情况下完成吗 不关闭套接字 困难的问题不是BufferedReader readLine 但
  • iOS / C:检测音素的算法

    我正在寻找一种算法来确定实时音频输入是否与 144 个给定 且完全不同的 音素对之一匹配 最好是完成这项工作的最低级别 我正在为 iPhone iPad 开发激进 实验性音乐培训软件 我的音乐系统包含 12 个辅音音素和 12 个元音音素
  • ipython笔记本终端不可用[重复]

    这个问题在这里已经有答案了 我安装了 anaconda 我得到了这个 蟒蛇2 7 9 我在 Windows 8 上运行 ipython 笔记本 但终端选项对我不可用 我该如何激活它 请 Windows 不支持 tty 终端 并且 termi
  • 文件上传过程中 Firefox 中的 mozFullPath 是否存在安全风险?

    我正在开发一个小照片应用程序 用户选择一个本地文件并将其推送到画布中window URL createObjectURL file 非常基本的东西 在测试过程中 我短暂地将文件数组的内容转储到控制台 只是为了确保我得到了我想要的东西 我在
  • EclipseLink:对 MappedSuperclass 的查询失败

    我的应用程序是一家销售鱼类 水族馆等的商店 我想根据销售数量获取所有商品中排名前 10 的商品列表 我使用以下课程 MappedSuperclass NamedQueries NamedQuery name getTopItems quer
  • iOS 随机数生成器新视图

    我需要一些有关应用程序的帮助 我需要为 0 到 15 之间的整数创建一个随机数生成器 然后根据创建的数字 将其推送到具有相应数字的视图 这就是我想要的工作方式 按下按钮 gt 随机数生成器给出 0 到 15 之间的数字 gt 视图推送到已分
  • 如何从 JavaScript 手动触发元素的 hx-get 事件

    我在用htmx https htmx org 向我的页面添加一些 AJAX 调用 我有一个cart count定义为在页面加载后 1 秒检索购物车中的商品数量的元素 span span 我也有一个add to cart按钮 在它自己的东西之
  • stderr:致命:找不到远程引用 $GERRIT_REFSPEC

    在有人枪杀我之前 我已经查看了所有有此错误的消息 但它们似乎是由不同的问题表现出来的 我无法获得任何实质性信息 以下是我在 git 轮询日志中遇到的错误 我对错误 1 没有任何线索 请提供输入 为此 我在其他问题上读到 当存在 gerrit
  • 类型错误:无法读取构建上未定义的属性(读取“调用”),但不能读取开发上的未定义属性

    我正在运行一个vite js安装了 web3 的应用程序 当我在开发模式下运行应用程序时 一切正常 但当我在生产模式 构建 下运行它时 它会失败并显示 TypeError Cannot read properties of undefine
  • 何时创建类与设置布尔标志?

    我有一个有趣的问题要提出 什么时候应该创建模型类 对象而不是为数据库中存储的数据设置布尔标志 例如 假设我有一个 Person 类 其中包含 President Guard 和 PartTime 的布尔标志 根据标志的值 此类 模型的处理方
  • 为什么我使用 pandas 读取 csv 文件的对象是 TextFileReader 对象

    我使用 pandas 读取 csv 文件 data raw pd read csv filename chunksize chunksize print data raw id 然后 它报告TypeError Traceback most
  • 在 Java 8 中创建嵌套父子列表

    我是 Java 8 的新手 需要解决以下问题 我有两个课程如下 class Person String name int age List