java—如何使用流从列表列表中获取对象

gev0vcfq  于 2021-07-12  发布在  Java
关注(0)|答案(2)|浏览(322)

我的对象是一组配置文件,其中包含一组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;
}

有什么解决办法吗?

bzzcjhmw

bzzcjhmw1#

它将给出以下结果: flatMap ```
public PerfilMenunode darPerfilMenuNode(List perfiles) {
return perfiles.stream()
.map(Perfil::getPerfilMenunodes)
.flatMap(Collection::stream)
.filter(pm -> pm.getMenunode()
.getNombreCorto()
.equals(Constante.MENU_ADMINPERFIL_NOMBRECORTO)
)
.findFirst()
.orElse(null);
}

但是如果您使用的是java-16,那么您可以使用 `Stream#mapMulti` 而不是 `flatMap` ,它提供更好的性能,如果 `perfilMenunodes` 是小集合还是空集合

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

lrl1mhuk

lrl1mhuk2#

我想它可以是这样的:

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

相关问题