Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/309.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 8可选如何处理太多的Orelse_Java_Lambda_Java 8_Optional - Fatal编程技术网

Java 8可选如何处理太多的Orelse

Java 8可选如何处理太多的Orelse,java,lambda,java-8,optional,Java,Lambda,Java 8,Optional,让我们看一看不带lambdas的示例: Credentials credentials = CredentialService.get(id); if (credentials != null && credentials.isActive()) { User user = UserService.get(credentials.getUserId()); if (user != null) return Status.ok(user); } re

让我们看一看不带lambdas的示例:

Credentials credentials = CredentialService.get(id);
if (credentials != null && credentials.isActive()) {
    User user = UserService.get(credentials.getUserId());
    if (user != null)
        return Status.ok(user);
}
return Status.bad();
如您所见,只有当用户不是
null
时,才会返回
Status.ok()。否则,将返回
Status.bad()
。现在使用lambdas(服务的方法现在返回
Optional
):


现在我必须返回两次
Status.bad()
(在实际代码中,大约4-5次)。这是一种返回
Status.bad()
一次的方法吗?

我可以猜UserService::get return可选在这种情况下,您最好使用flatMap:

CredentialService.get(id)
         .filter(Credentials::isActive)
            .flatMap(credentials -> UserService.get(credentials.getUserId())
            .map(Status::ok)
            .orElse(Status.bad())

我没有关于这些代码行的详细信息。但可能只需要返回最后一个
.orElse(Status.bad())
也许您可以考虑一下。@NicolasFilotto,
可选
,因此
过滤器存在@smsnheck,你说得对,它只取决于剩余的
orElse
中的
Optional
。它与
.orElse(可选.empty()).orElse(null)
一起使用。这是一种不让人困惑的方法吗?也有可能你的代码看起来像垃圾,无论你是否使用可选的,因为设计是关闭的。Java8的功能组件只是另一种编程方法,而不是通常给出的神奇童话。我发现在每个问题上都使用lambda是一种非常糟糕的编程风格,而更持久、更优雅的解决方案是向服务层添加
getActiveCredentials(id)
(例如)。@Kayaman:问题不在于lambda表达式的使用或
可选的
,但是原始代码中已经包含的逻辑。对于可能失败的一长串事件,将返回一个通用的
Status.bad()
,将调用方和用户留在一起,而不显示失败的原因。这就像臭名昭著的
java.io.File.delete()
返回一个
boolean
false
表示出了问题,猜猜看。现在,新的
java.nio.file.Files.delete(Path)
通过不同的异常类型发送不同的错误条件。就像是思想的食粮…
CredentialService.get(id)
         .filter(Credentials::isActive)
            .flatMap(credentials -> UserService.get(credentials.getUserId())
            .map(Status::ok)
            .orElse(Status.bad())