2016-05-27 11 views
0

私は勉強しようとしていますJava 8の機能オプションです。 Optional.orElseがどのように動作しているのか混乱しています。ここで私が試したものです:オプションの理解。orElse

public class OptionalsExample { 

    public static void main(String[] args) { 
     Name userName = new Name(); 
     userName.setName("John Doe"); 
     Optional<Name> optionalName = Optional.ofNullable(userName); 
     optionalName.ifPresent(
       (Name value) -> { 
        Optional<String> optionalNameString = Optional.ofNullable(value.getName()); 
        optionalNameString.ifPresent(name -> System.err.println("Name is: " + optionalNameString.get())); 
       } 
     ); 
    } 
    private static void printError() { 
     System.err.println("No Name present"); 
    } 
} 

私の懸念は、名前が設定されている場合、すべてが正常に動作しますが、名前が設定されていないときに私がorElseを実行したいということです。私が見つけたん名前を印刷しないように

userName.setName("John Doe"); 

コメント際 は、私が何かをしたい

私はそれをどのように行うことができますか?

TIA

+1

'optionalNameString.ifPresent(name - > ...)'と書くと、実際の 'String'はすでに' name'パラメータで提供されているので、 'optionalNameString'で' get() 'を呼び出すのは意味がありません。ラムダ式の中で。同様に、 'Optional'が空のときにラムダ式が実行されないので、この場所で' orElse'を呼び出すのは意味がありません。 – Holger

答えて

3

ネストされたifPresentコールの使用方法は、他の多くの質問で示されている(ネストされた)forEachコールのストリームと非常によく似ています。

機能的思考をよりよく試してくださいという明確な兆候です。あなたが何をしたいか

は空Optionalに適用mapのpingのステップは何でもするが、再び空Optionalを返さないこと、である、

System.out.println(
    Optional.ofNullable(userName) // will be an empty optional if userName is null 
      .map(Name::getName) // will turn to empty optional if getName returns null 
      .map("Name is: "::concat) // prepend "Name is: " (only when we have a name) 
      .orElse("No Name Found") // get the result string or the alternative 
    ); 

理解するための重要なポイントです。いずれの場合でも印刷したいので、printステートメントはコンシューマとして渡されず、スタンドアローンステートメントとして記述され、orElse呼び出しによって返された値を出力します。これは、null処理ステップの結果、または代わりのString

+0

@hogler m開始、それほど遅くはありません;)説明をありがとう – sector11

-1

orElse方法は、オプションの1つが存在しないときは、代替値を返すことができます。

あなたはちょうどあなたが代替文字列を返すようにorElseメソッドを使用することができ、代替文字列を印刷したい場合:

Optional<String> optionalNameString = Optional.ofNullable(value.getName()); 
System.out.println(optionalNameString.orElse("Name is not present")); 

値がisPresentを(使用して存在している場合はそうでないあなただけ確認することができます)

Optional<String> optionalNameString = Optional.ofNullable(value.getName()); 
if(optionalNameString.isPresent()) { 
    // do something 
} else { 
    //do something else 
} 
+1

ifsを使用している場合のオプションの目的は何ですか:p – sector11

+0

@ sector11 NPEを避ける –

関連する問題