我正在尝试习惯使用 lambda 表达式,但我经常遇到这样的基本问题:
public List<Location> findAllAccessByUser(User user) {
return listDao.getAccessList(user).stream()
.filter(list -> findBySubOrgId(list.getOwnerOrg().getId()).isPresent())
.map(list -> findBySubOrgId(list.getOwnerOrg().getId()).get())
.collect(Collectors.toList());
}
这个方法
- 获取 AccessList 对象的列表,
- 从每个对象读取 subOrgId 属性
- 使用 findBySubOrgId() 方法返回(可选)Location 对象。
- 将对象收集到位置对象列表中。
由于 findBySubOrgId() 返回一个可能不存在的可选值,我认为我需要对其进行过滤,以便返回列表不包含任何空元素。但随后我重复调用相同的方法,这似乎很浪费。
通常我会将它分配给一个变量并重用它,但我找不到如何使用 lambda 执行此操作的引用 - 或者是否有必要。
或者,我可以在 map() 表达式中放置一个条件,但我再次不确定如何执行此操作并确保删除空值。
正如所写,它的工作原理完全符合我的预期,但我总是尝试优化我的代码,并且学习正确的做事方法永远不会有坏处。重写这个的“正确”方法是什么?还是就这样就可以了?
最佳答案
return listDao.getAccessList(user).stream()
.map(list -> findBySubOrgId(list.getOwnerOrg().getId()))
.filter(Optional::isPresent)
.map(Optional::get)
.collect(Collectors.toList())
关于Java lambda表达式冗余调用外部方法——如何重写?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41293989/