首页 > 解决方案 > 如何使用流从列表列表中获取对象

问题描述

我的对象是一组配置文件,里面有一组 PerfilMenunode

public class Perfil {
    [...]
    @OneToMany(cascade = CascadeType.ALL)
    @JoinColumn(name = "ID_PERFIL")
    @LazyCollection(LazyCollectionOption.FALSE)
    private List<PerfilMenunode> perfilMenunodes;

我想要做的是这个功能,但只使用流

public PerfilMenunode darPerfilMenuNode(List<Perfil> perfiles) {
    PerfilMenunode perfilMenunode = null;
    for (Perfil perfil : perfiles) {
        perfilMenunode = perfil.getPerfilMenunodes().stream().filter(pm -> pm.getMenunode().getNombreCorto().equals(Constante.MENU_ADMINPERFIL_NOMBRECORTO)).findFirst().orElse(null);
        if(perfilMenunode!=null) {
            return perfilMenunode;
        }
    }
    return perfilMenunode;
}

有什么解决办法吗?

标签: javaliststream

解决方案


它会给出以下使用flatMap

public PerfilMenunode darPerfilMenuNode(List<Perfil> perfiles) {
    return perfiles.stream()
            .map(Perfil::getPerfilMenunodes)
            .flatMap(Collection::stream)
            .filter(pm -> pm.getMenunode()
                            .getNombreCorto()
                            .equals(Constante.MENU_ADMINPERFIL_NOMBRECORTO)
            )
            .findFirst()
            .orElse(null);
}

但是,如果您使用的是,则可以使用Stream#mapMulti而不是flatMap,它可以提供更好的性能,如果您perfilMenunodes是小集合或空集合,则效果会更好

public PerfilMenunode darPerfilMenuNode(List<Perfil> perfiles) {
    return perfiles.stream()
            .mapMulti((Perfil perfil, Consumer<PerfilMenunode> consumer) -> {
                perfil.getPerfilMenunodes().forEach(consumer::accept);
            })
            .filter(pm -> pm.getMenunode()
                            .getNombreCorto()
                            .equals(Constante.MENU_ADMINPERFIL_NOMBRECORTO)
            )
            .findFirst()
            .orElse(null);
}

推荐阅读