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

时间:2016-12-23 01:22:02

标签: 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. 将对象收集到Location对象列表中。
  5. 由于findBySubOrgId()返回一个可能不存在的Optional,我想我需要对其进行过滤,以便返回List不包含任何空元素。但后来我重复调用相同的方法,这似乎很浪费。

    通常我会将它分配给变量并重复使用,但我无法找到如何使用lambdas进行此操作的参考 - 或者如果它甚至是必要的。

    或者我可以在map()表达式中添加一个条件,但我又不知道如何执行此操作并确保删除空值。

    正如所写,它完全按照我的预期工作,但我总是试图优化我的代码,并且学习正确的做事方式永远不会伤害。什么是&#34;正确&#34;重写这个的方法?或者这样很好吗?

1 个答案:

答案 0 :(得分:2)

var resArray = [Res1, Res2,...];
ResToUse = resArray[i - 1];