2016-02-11 12 views
14

Optional.ofNullableメソッドに驚いた。私はオプションを返すことになっ機能書いたいくつかの日:オプション.Nullableとメソッド連鎖

private Optional<Integer> extractFirstValueFrom(InsightsResponse insight) { 
    return Optional.ofNullable(insight.getValues().get(0).getValue()); 
} 

は、私が誤ってOptional.ofNullableは引数式のいずれかのNullPointerExceptions内部を予防することを考えました。

今、私はそれが非常にばかげた考えであることを知っていると思います。 Javaは引数を最初に解決して、Optional.ofNullable呼び出しに渡す必要があります。

しかし、私は質問があります。私の目標を達成するうえで、素晴らしい方法がありますか?式insight.getValues().get(0).getValue()から整数値またはnullを取得したいと考えています。 Nullは、それぞれ式insight.getValues()またはinsight.getValues().get(0)のいずれかです。

私はこれをtry/catchブロックに入れることができることを知っていますが、より洗練されたソリューションがあるかどうかは疑問です。 #extractFirstValueFromはのはinsightは常にsomethingであると仮定しましょう、グアバのcheckNotNull()などのヌルのため@Nullableもチェックどちらが含まれていないとして、このような

+0

あなたのケースでは、 'insight'がnullです。メソッド内でnullをチェックするのではなく、nullをメソッドに渡すことは決してお勧めしません。 –

答えて

20

あなたがnullことができるか分からない、またはnullのためにすべてをチェックしたい場合は、唯一の方法はOptional.mapにチェーンコールにある:

値が存在する場合に提供されるマッピング関数を適用結果がnullでない場合は、結果を記述するOptionalを返します。それ以外の場合は空を返します。このよう

、マッパリターンnull場合、空Optionalチェーンコールすることを可能にする、返されます。 orElse(0)

Optional.ofNullable(insight) 
     .map(i -> i.getValues()) 
     .map(values -> values.get(0)) 
     .map(v -> v.getValue()) 
     .orElse(0); 

最終呼び出しは、任意のマッパーがnullを返した場合、デフォルト値0を返すことができます。

2

なめらかは、与えられたサンプルコードに応じて、うまく

Optional.ofNullable(insight.getValues()).map(vals -> vals.get(0)).map(v -> v.getValue()) 

を動作するはずです。したがって、Optional.ofNullable(insight.getValues())Optionにラップすると、NPEにはなりません。呼び出しのチェーンが変換されます(それぞれの結果はOptionalとなります)。結果はOptional<Integer>となり、SomeまたはNoneのいずれかになります。

関連する問題