2016-05-09 7 views
1

私は以下のソースを読んでいましたが、なぜ地球上でフラットマップの方法を使うのだろうと思っていました。私がそれを見ると、最初のヌルで終了し、他のものをチェックするのを煩わしくなく、ラッパーで素敵にうまくフィットする、if文を介した単純なヌルチェックよりも多くのオブジェクトがインスタンス化されます。単純なヌルチェックで(フラット)マップを使用するメリットはありますか?

私はそれを見るようにチェックが速い場合+より多くのメモリ(私は通常のみ実行するコードの多くのために2〜3ミリ秒を持っているようにスピードがすべてであれば、私にとって本当に重要です)

安全「(フラット)マップ」をオプションで使用する利点は何ですか?なぜ私はそれに切り替えることを検討する必要がありますか? http://winterbe.com/posts/2014/07/31/java8-stream-tutorial-examples/あなたが可能NullPointerExceptionsがすることを防止するために、複数のヌルチェックを追加する必要があり、外側のインスタンスの内側の文字列fooのを解決するために

class Outer { 
    Nested nested; 
} 

class Nested { 
    Inner inner; 
} 

class Inner { 
    String foo; 
} 

から

Outer outer = new Outer(); 
if (outer != null && outer.nested != null && outer.nested.inner != null) { 
    System.out.println(outer.nested.inner.foo); 
} 

オプションのフラットを利用すると同じ動作が得られます地図の操作:

Optional.of(new Outer()) 
    .flatMap(o -> Optional.ofNullable(o.nested)) 
    .flatMap(n -> Optional.ofNullable(n.inner)) 
    .flatMap(i -> Optional.ofNullable(i.foo)) 
    .ifPresent(System.out::println); 
+2

私はhttp://stackoverflow.com/questions/35337020/optional-ofnullable-and-method-chainingを使用することになり、つまりはない 'flatMap'なく、' map' ... – Tunaki

+0

それ後者は 'inner.foo'もチェックするようです。それ以外に、私はそのイディオムを使用しないでしょう - それは実際に何が起こっているのか複雑すぎます。しかし、私はそれが意見の問題だと思います。 – Mena

+0

私は、スピードが本当に私にとって重要なので、私は切替えを検討すべき理由にもっと興味があります。コードスタイルを守らない。私が気づいていないなどの利点はありますか?私は15年の経験を "古風"のやり方でしていますが、ラムダのものを探求し始めています。 – Tschallacka

答えて

2

私はOptionalの使用は、より広いストリーミングコンテキストではなく、1つのライナーでより明確になると思います。

ArrayListOutersitemsといい、存在する場合はfoo文字列のストリームを取得する必要があるとします。

我々はこれを行うことができます:

//bad example, read on 
Stream<String> allFoos = list.stream() 
      .filter(o -> o != null && o.nested != null && o.nested.inner != null) 
      .map(o -> o.nested.inner.foo); 

しかし、私は、外側(o != null && o.nested != null && o.nested.inner != nullo.nested.inner.foo)から文字列を取得する方法について、自分自身を繰り返していただ

Stream<String> allFoos = 
     list.stream() 
       .map(o -> Optional.ofNullable(o) 
         .map(t -> t.nested) 
         .map(n -> n.inner) 
         .map(i -> i.foo)) 
       .filter(s -> s.isPresent()) 
       .map(s -> s.get()); 

また、これは私を与えますデフォルト値を挿入する簡単な方法:

Stream<String> allFoos = 
      list.stream() 
        .map(o -> Optional.ofNullable(o) 
          .map(t -> t.nested) 
          .map(n -> n.inner) 
          .map(i -> i.foo) 
          .orElse("Missing")); 

トン以下のようになります。

//bad example (IMO) 
Stream<String> allFoos = list.stream() 
      .map(o -> o != null && o.nested != null && o.nested.inner != null ? 
        o.nested.inner.foo : "Missing"); 
+0

あなたはどういう意味ですか、私は自分自身を繰り返していたのですか? – Tschallacka

+1

@MichaelDibbetsは編集を参照 – weston

+0

これは、この構造体を使用すると、ネストされたif文とelsesの醜い混乱を得る代わりに、nullの場合にデフォルト値を挿入する余地が増えることです。あれは正しいですか? – Tschallacka

関連する問題