2016-11-08 47 views
3

让我们来看看例子不lambda表达式:的Java 8可选如何处理太多orElses

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(); 

正如你所看到的,只有当用户不nullStatus.ok()将被退回。否则,将返回Status.bad()。现在,随着lambda表达式(服务的方法现在返回Optional<T>):

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

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

+0

我没有关于这行代码的任何细节的更多信息。但也许只需要返回最后的'.orElse(Status.bad())'也许你可以考虑一下。 – smsnheck

+0

@NicolasFilotto,'可选',所以'filter'存在。 @smsnheck,你说得对,它只取决于其余'orElse'中的'Optional'。它适用于'.orElse(Optional.empty())。orElse(null)'。这是一种让它不令人困惑的方法吗? – Feeco

+1

无论您是否使用可选或不可用,因为设计关闭,您的代码也可能看起来像垃圾。 Java 8的功能组件只是另一种编程方法,而不是神奇的仙尘。 – Kayaman

回答

7

我能猜到UserService ::得到在这种情况下返回可选您更好地使用flatMap:

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