Java 8可选如何处理太多orElses

Fee*_*eco 3 java lambda optional java-8

让我们看一下没有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();
Run Code Online (Sandbox Code Playgroud)

如您所见,Status.ok()只有在用户不是时才会返回null.否则,Status.bad()将被退回.现在使用lambdas(Service的方法现在返回Optional<T>):

return CredentialService.get(id)
        .filter(Credentials::isActive)
        .map(credentials -> UserService.get(credentials.getUserId())
            .map(Status::ok)
            .orElse(Status.bad())              
        ).orElse(Status.bad());
Run Code Online (Sandbox Code Playgroud)

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

小智 7

我可以猜测UserService :: get return在这种情况下你最好使用flatMap:

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