Java lambda表达式冗余调用外部方法——如何重写?

标签 java lambda

我正在尝试习惯使用 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());
    }

这个方法

  1. 获取 AccessList 对象的列表,
  2. 从每个对象读取 subOrgId 属性
  3. 使用 findBySubOrgId() 方法返回(可选)Location 对象。
  4. 将对象收集到位置对象列表中。

由于 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/

相关文章:

java - 小 helper 类的OOP设计

visual-studio - 具有两个相同类型的自动参数的 MSVC lambda

c# - 如何在 C# 中调用具有动态属性的泛型方法

java - "Skip"Java中未关闭流的Stream.read操作

java - onContextItemSelected 中奇怪的 int 比较错误

java - CompletableFuture.runAsync(() ->... 带有非最终变量

python - lambda 函数不返回任何内容

c# - 在 Visual Studio 2010 中自动格式化 lambda 函数

java - EMR ClassNotFoundException java 中的 Spark 提交

java - 使用 Eclipse Indigo 构建 Jar 文件