2016-01-20 8 views
8

ので、もしいくつか読んだ後、私はのJavaオプション - else文

if (optional.isPresent()) { 
    //do smth 
} 

はオプション(http://www.oracle.com/technetwork/articles/java/java8-optional-2175753.html)を使用するための好ましい方法ではないことを見てきました。しかし、もし私がこのようなif文を持っていたら:

if (optional.isPresent()) { 
    car = getCar(optional.get()); 
} else { 
    car = new Car(); 
    car.setName(carName); 
} 

これはこれを行う最善の方法ですか、それとももっとお勧めの方法ですか?

+0

私はあなたがif文を必要としているかどうか疑問に思っています。 – Stultuske

+0

@assyliasどのように機能しますか?オプションの戻り値は、カーオブジェクトではなく、IDになりますか? – uraza

+0

実際には、いくつかのメソッドから戻り値がなくなる可能性があることを開発者に示すためにラッパーが導入されており、余分な考慮が必要です。 – Antoniossss

答えて

16

次のようにOptionalを使用できます。 if-else文で書く

Car car = optional.map(id -> getCar(id)) 
      .orElseGet(() -> { 
       Car c = new Car(); 
       c.setName(carName); 
       return c; 
      }); 

は不可欠なスタイルであり、それはif-elseブロックの前に宣言される変数carが必要です。

mapOptionalに使用すると、より機能的なスタイルです。また、この方法は事前に変数宣言を行う必要はなく、Optionalを使用することをお勧めします。

+4

これは実際に動作するように見えます。しかし、それがコードをより読みやすくしたり、このように書くことに利点があるかどうかは疑問です。 – uraza

+0

このように書くと、 'Car car'変数を宣言する必要がなくなります。 – TheKojuEffect

+0

@uraza if-elseは命令的スタイルであり、このアプローチを使用するのは機能的なスタイルです。このように可読性が向上します。 – TheKojuEffect

3

あなたは、あなたがこれを書くことができ、Carコンストラクタに名前を組み込むことができた場合:あなたは、コンストラクタとは別にセッターを呼び出す必要がある場合は

car = optional.map(id -> getCar(id)) 
       .orElseGet(() -> new Car(carName)); 

、あなたはこのようなものに終わるだろう:

car = optional.map(id -> getCar(id)) 
       .orElseGet(() -> { 
        Car c = new Car(); 
        c.setName(carName); 
        return c; 
       }); 
+1

オプションが空でない場合、orElseGetは本当にCarオブジェクトを返しますか? – uraza

+0

'Car'に' carName'パラメータを持つコンストラクタがある場合、 'car = optional.orElse(new Car(carName));'を使用できます。 – TheKojuEffect

+0

'Op'は' Optional'からではなく 'car'を得るために' getCar'メソッドを使用しています。 – TheKojuEffect