gpt4 book ai didi

java - 使用 Java 流将平面列表转换为具有子对象的域对象

转载 作者:搜寻专家 更新时间:2023-10-31 20:08:05 25 4
gpt4 key购买 nike

我的传入对象具有扁平的非规范化结构,我从 JDBC 结果集实例化了这些对象。传入对象反射(reflect)了结果集,有大量重复数据,因此我想将数据转换为具有嵌套子集合的父对象列表,即对象图或规范化列表。

传入对象的类如下所示:

class IncomingFlatItem {
String clientCode;
String clientName;
String emailAddress;
boolean emailHtml;
String reportCode;
String reportLanguage;
}

因此传入数据包含每个客户端的多个对象,我想将这些对象聚合到一个客户端对象中,该对象包含客户端的电子邮件地址对象列表和报告对象列表。

所以 Client 对象看起来像这样:

class Client {
String clientCode;
String clientName;
Set<EmailAddress> emailAddresses;
Set<Report> reports;
}

奇怪的是,我找不到现成的答案。我正在查看嵌套流或链接流,但我想找到最优雅的方法,而且我绝对想避免 for 循环。

最佳答案

你可以使用这个:

List<Client> clients = items.stream()
.collect(Collectors.groupingBy(i -> Arrays.asList(i.getClientCode(), i.getClientName())))
.entrySet().stream()
.map(e -> new Client(e.getKey().get(0), e.getKey().get(1),
e.getValue().stream().map(i -> new EmailAddress(i.getEmailAddress(), i.isEmailHtml())).collect(Collectors.toSet()),
e.getValue().stream().map(i -> new Report(i.getReportCode(), i.getReportLanguage())).collect(Collectors.toSet())))
.collect(Collectors.toList());

开始时,您按 clientCodeclientName 对项目进行分组。之后,您将结果映射到您的 Client 对象。

确保为 EmailAddressReport 实现了 .equals()hashCode() 方法以确保它们在集合中是不同的。

关于java - 使用 Java 流将平面列表转换为具有子对象的域对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56598524/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com