使用 Java 8 流从另一个列表创建对象列表



我有三个dto类:

public class OrganismeDTO {
private Long organismeId;
private String libelle;
private List<RoleDTO> rolesDTO;
}
public class RoleDTO {
private String lib;
private Long roleId;
private List<ProfilDTO> profilsDTO;
}
public class UtilisateurRoleDto {
private String organismeLib;
private String roleLib;
}

在我的DAO中,我有一个函数,它将返回UtilisateurRoleDto列表。

我想要的,是从UtilisateurRoleDto列表中创建一个OrganismeDTO列表(我可以从我的 DAO 中获得),例如,如果我有一个UtilisateurRoleDto列表,如下所示:

"Organisme 1", "Role 1"
"Organisme 1", "Role 2"
"Organisme 2", "Role 1"
"Organisme 2", "Role 3"
"Organisme 3", "Role 3"

我想要一个结果中的OrganismeDTO列表如下(其中每个OrganismeDTO都有一个RoleDTO列表):

"Organisme 1" : ["Role 1", "Role 2"]
"Organisme 2" : ["Role 1", "Role 3"]
"Organisme 3" : ["Role 3"]

如何使用 Java 8 流实现这一点?

更新:

当我构造RoleDTO时,我需要通过从获取OrganismeDTO.roleId并返回List<ProfilDTO>的函数获得的列表注入RoleDTO.profilsDTO

您可以使用自定义集合来做到这一点(我添加了getters和一些明显的构造函数):

Map<String, OrganismeDTO> map = dt.stream().collect(HashMap::new, (m, t) -> {
m.computeIfAbsent(t.getOrganismeLib(), x -> new OrganismeDTO(t.getOrganismeLib())).getRolesDTO().add(new RoleDTO(t.getRoleLib()));
}, (m1, m2) -> {
m2.forEach((k,v) -> {
OrganismeDTO organismeDTO = m1.get(k);
if (organismeDTO != null ) {
organismeDTO.getRolesDTO().addAll(v.getRolesDTO());
} else {
m1.put(k, v);
}
});
});

然后,如果从值创建List,剩下的就是了。

List<OrganismeDTO> list = map.values().stream().collect(Collectors.toList());

目前我能想到的唯一方法是:

Map<String, List<String>> collect = list.stream()
.collect(Collectors.groupingBy(UtilisateurRoleDto::getOrganismeLib,
Collectors.mapping(UtilisateurRoleDto::getRoleLib, Collectors.toList())));
List<OrganismeDTO> result = collect.entrySet().stream()
.map(entry -> new OrganismeDTO(entry.getKey(),
entry.getValue().stream()
.map(RoleDTO::new)
.collect(toList())))
.collect(Collectors.toList());

首先,您可以按organismeLib字段对UtilisateurRoleDto进行分组。之后,处理获得的结果并将其映射到所需的实体。

最新更新