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

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

我的对象是一组配置文件,其中包含一组perfilmenunode

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

我想做的是这个函数,但只使用流

  1. public PerfilMenunode darPerfilMenuNode(List<Perfil> perfiles) {
  2. PerfilMenunode perfilMenunode = null;
  3. for (Perfil perfil : perfiles) {
  4. perfilMenunode = perfil.getPerfilMenunodes().stream().filter(pm -> pm.getMenunode().getNombreCorto().equals(Constante.MENU_ADMINPERFIL_NOMBRECORTO)).findFirst().orElse(null);
  5. if(perfilMenunode!=null) {
  6. return perfilMenunode;
  7. }
  8. }
  9. return perfilMenunode;
  10. }

有什么解决办法吗?

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

  1. 但是如果您使用的是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#

我想它可以是这样的:

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

相关问题