繁体   English   中英

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

[英]Create a list of objects from another list using Java 8 streams

我有这三个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我需要按列表插入RoleDTO.profilsDTO ,该列表是从一个采用OrganismeDTO.roleId并返回List<ProfilDTO>的函数获得的。

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

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

首先,你可以将你UtilisateurRoleDto通过它的organismeLib场。 之后,您处理获得的结果并将其映射到所需的实体。

您可以使用自定义的collect(我添加了getter和一些显而易见的构造函数)来做到这一点:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM