2016-11-08 6 views
3

に対処する方法のは、ラムダなしの例を見てみましょう: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(); 

あなたが見ることができるように、Status.ok()ユーザーがnullない場合にのみ返されます。それ以外の場合はStatus.bad()が返されます。今ラムダで(サービスのメソッド今Optional<T>を返す):

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

今私は(実際のコードでは、およそ4-5)Status.bad() 2回を返すことがあります。それは一度Status.bad()を返す方法ですか?

+0

。しかし、最後の '.orElse(Status.bad())'を返すだけでよいかもしれません。おそらくそれについて考えることができます。 – smsnheck

+0

@NicolasFilotto、 'Optional '、 'filter'が存在します。 @smsnheck、そうです、それは残りの 'orElse'に' Optional'だけ依存します。これは '。orElse(Optional.empty()).Else(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()) 
関連する問題