4

このようなものを書いて、要素がnullではなく、コレクションが空でないかどうかのチェックを避けることは可能ですか:

 response.getBody()
    .getRequestInformation()
    .getRequestParameters().get(0)
    .getProductInstances().get(0)
    .getResultParameters()

私はこのようなものを見つけました http://winterbe.com/posts/2015/03/15/avoid-null-checks-in-java/

基本的に、私が達成したいのは、複数のチェック天気オブジェクトを含む if ステートメントが null または階層内のコレクションが空であることを避けることです。上記の投稿で、オプションの「Nullチェックは内部で自動的に処理される」で可能であると読みました。

すでに解決策がある場合は、重複して申し訳ありませんが、それを参照してください。

4

1 に答える 1

7

をチェーンしたい場合Optionalは、そのmap(Function<? super T,? extends U> mapper)メソッドを使用してマッパー関数を呼び出すことができます。そうでない場合にのみ、次のように最初の要素を取得するためにnull使用できます。flatMap(Stream::findFirst)Collection

Optional<List<ResultParameterClass>> parameters = Optional.ofNullable(response)
    .map(ResponseClass::getBody)
    .map(BodyClass::getRequestInformation)
    .map(RequestInformationClass::getRequestParameters)
    .map(Collection::stream)
    .flatMap(Stream::findFirst)
    .map(RequestParameterClass::getProductInstances)
    .map(Collection::stream)
    .flatMap(Stream::findFirst)
    .map(ProductInstanceClass::getResultParameters);

に存在する場合はリストを返すか、存在しOptionalない場合は new のようなものを返すこと は可能ArrayList<ResultParameterClass>()ですか?

そうです、デフォルト値を使用orElseGet(Supplier<? extends T> other)または指定するだけで済みます。結果は ではなく.orElse(T other)OptionalList<ResultParameterClass>

したがって、コードは次のようになります。

List<ResultParameterClass> parameters = Optional.ofNullable(response)
    ...
    .map(ProductInstanceClass::getResultParameters)
    .orElseGet(ArrayList::new);
于 2016-11-07T15:44:42.730 に答える