java - 如何使用流从列表列表中获取对象
问题描述
我的对象是一组配置文件,里面有一组 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;
}
有什么解决办法吗?
解决方案
它会给出以下使用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);
}
但是,如果您使用的是java-16,则可以使用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);
}
推荐阅读
- python - 从现有数据框中添加新列以使每个 Id/Day 有一行
- prolog - Prolog 如何得出 3 < 2 之类的无意义结果?
- laravel - localhost 上的 Nuxt serverInit axios 获取 ENOTFOUND
- javascript - 使用 else if 语句更改背景颜色 - JQuery
- java - Java反汇编包含组件中方法头的字符串
- python - 如何正确绑定未存储在变量中的 wx.MenuItems
- javascript - 不能在 querySelector 上使用 forEach
- r - 如何在 R 中仅识别由“-”联合的单词?
- kubernetes - 如何将 fsGroup 设置为命名空间中的所有 pod
- vue.js - 如何将数组对象参数从 vue 网站传递给 google appscript 以设置 google 电子表格列值