2016-09-01 8 views
0

複数の変換後にfindAny()を使用すると、ストリームの実行が遅延しますか?私は、コードの状況を次のようしている

return modulePatternPairs.stream() 
       .filter(it -> it.matches(absoluteFilePath)) 
       .map(ModulePatternPair::getModule) 
       .findAny() 

私の質問:前いずれかを見つけることを、行って、あるいはそれを遅延行われているすべての以前の値のマップがされて - マッピングされた1つの変数のみで、その後、返された結果?私はむしろ使用するべきです:

return modulePatternPairs.stream() 
       .filter(it -> it.matches(absoluteFilePath)) 
       .findAny() 
       .map(ModulePatternPair::getModule) 

私は最初にマッピングし、次にフィルタをかけてfindAnyをすればいいのですか?

return modulePatternPairs.stream() 
      .filter(it -> it.matches(absoluteFilePath)) 
      .findAny() 
      .map(ModulePatternPair::getModule) 

本当に意味:2番目のスニペットは

+3

[ドキュメント](https://docs.oracle.com/javase/8/docs/api/java/util/stream/package-summary.html#StreamOps)を読む方法はありますか? – Holger

+0

ちょうど最初のスニペットを使用してください – AdamSkywalker

答えて

3

私はあなたの質問に答えるべきだと思い
ModulePatternPair mp 
    = modulePatternPairs.stream() 
      .filter(it -> it.matches(absoluteFilePath)) 
      .findAny(); 
mp.map(ModulePatternPair::getModule)... 

- 最初の文が単一になり、完全なストリームパイプラインを実行しますModulePatternPair。最初のパイプラインは最小要素生成/フィルタリングを行い、それを求める必要があります。次に、2番目のストリームパイプライン(1つの要素のストリームを取得しているため、愚かです)がマッピングを実行します。コメントした人の一人として、あなたはちょうど1つのパイプライン(あなたの最初のスニペット)として実行する必要があり、すべてがうまくいくでしょう。

+2

正確ではありません。 'findAny()'は 'Optional'を返すので、フォローアップ' .map'は 'Optional'に適用され、新しいストリームパイプラインは開始せず、' Optional'を別の 'Optional'に変換します。概念的には間違いではなく、 'parallel'ストリームの場合には、' Stream.map'が保証していないマッピング関数の評価が1つしかないことを保証します。それは違いを生む。ですから、 '.map(f).findAny()'や '.findAny()。map(f)'を書くかどうかに違いはありません。 – Holger

+3

@Holgerは、私の答えの厄介な - しかし - 付随的な部分を拾うの趣味をしているようだ:)しかし、ポイントがあった:最初のスニペットがすべて1つのチェーンとして書かれている方法は、計算が行われます。私の2番目のバージョンのようにパイプラインを単一のステートメントとして記述すると、一般的には何が起こっているのかがより明確になります。 –

関連する問題