Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java lambda表达式对外部方法的冗余调用——如何重写?_Java_Lambda - Fatal编程技术网

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

Java lambda表达式对外部方法的冗余调用——如何重写?,java,lambda,Java,Lambda,我试图习惯使用lambda表达式,但我经常遇到以下基本问题: public List<Location> findAllAccessByUser(User user) { return listDao.getAccessList(user).stream() .filter(list -> findBySubOrgId(list.getOwnerOrg().getId()).isPresent()) .map(li

我试图习惯使用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());
    }
公共列表findalAccessByUser(用户){
返回listDao.getAccessList(user.stream())
.filter(list->findBySubOrgId(list.getOwnerOrg().getId()).isPresent())
.map(list->findBySubOrgId(list.getOwnerOrg().getId()).get())
.collect(Collectors.toList());
}
这种方法

  • 获取AccessList对象的列表
  • 从每个对象读取子RGID特性
  • 使用findBySubOrgId()方法返回(可选)位置对象
  • 将对象收集到位置对象列表中
  • 由于findBySubOrgId()返回一个可能不存在的可选元素,我想我需要对它进行过滤,以便返回列表不包含任何空元素。但是我重复调用了相同的方法,这似乎是浪费

    通常我会将其分配给一个变量并重用它,但我找不到如何使用lambdas实现这一点的参考——或者如果有必要的话

    或者,我可以在map()表达式中加入一个条件,但我也不知道如何做,并且一定要删除null


    正如我所写的,它完全按照我的预期工作,但我总是尝试优化我的代码,并且学习正确的方式做事情从来没有坏处。重写这个的“正确”方法是什么?还是像现在这样好

    首先将
    映射到
    可选
    ,然后
    过滤出不存在的值,然后将
    映射到它们的值。(或者使用
    orElse(null)
    filter
    out
    null
    值跳过
    map
    步骤。)
    map
    首先映射到
    可选的
    ,然后
    过滤出不存在的值,然后
    映射到它们的值。(或者使用
    orElse(null)
    filter
    out
    null
    值跳过
    map
    步骤。)这一点现在看起来很明显。谢谢对于纯方法引用版本,将第一个
    map()
    调用替换为
    map(XX::getOwnerOrg).map(XX::getId).map(this::findBySubOrgId)
    ,其中两个
    XX
    是适当的类名,并假设
    findBySubOrgId()
    是非静态的。现在看来这很明显。谢谢对于纯方法引用版本,将第一个
    map()
    调用替换为
    map(XX::getOwnerOrg).map(XX::getId).map(this::findBySubOrgId)
    ,其中两个
    XX
    是适当的类名,并假设
    findBySubOrgId()
    是非静态的。
    return listDao.getAccessList(user).stream()
            .map(list -> findBySubOrgId(list.getOwnerOrg().getId()))
            .filter(Optional::isPresent)
            .map(Optional::get)
            .collect(Collectors.toList())