2016-08-18 6 views
10

次のようなリストがあるとします。 CoreResultのフィールドのフィールドはList<Double>です。リストのリストをフラット化する3つの方法。そのうちの1つを好む理由はありますか?

final List<CoreResult> list = new LinkedList<>(SOME_DATA); 

目的は、各CoreResultオブジェクトからその特定のフィールドを抽出した後、リストを平坦化することです。 ここには3つのオプションがあります。それらのうちのいずれかが他のものよりも好ましいか?

オプション1map() Viaフィールドを抽出し、コレクタの内部に平ら

final List<Double> A = list.stream().map(CoreResult::getField) 
      .collect(ArrayList::new, ArrayList::addAll, ArrayList::addAll); 

オプション2flatMap()介し平坦、map() Viaフィールドを抽出し、単純なコレクタ

final List<Double> B = list.stream().map(CoreResult::getField) 
      .flatMap(Collection::stream).collect(Collectors.toList()); 

オプション3:フィールドを抽出して1回でフラット化するそこCoreResultから任意のフィールドを抽出する必要はなかったし、代わりに1は、単にList<List<Double>>を平らにしたい場合flatMap()、シンプルコレクタ

final List<Double> C = list.stream().flatMap(
      x -> x.getField().stream()).collect(Collectors.toList()); 

は、答えは違うだろうか?

+2

パフォーマンスを気にする人は、 'LinkedList'を使うべきではありません。 'SOME_DATA'は既にコレクションでなければならないので、別の' List'にコピーする意味がありません。したがって、好ましい方法は 'SOME_DATA.stream()です。/*あなたが好きな3つのオプションのうちのどれでも*/'... – Holger

答えて

16

私は一つ一つのパフォーマンスについてはよく分からないんだけど、重要な側面のJavaストリームによって利用されるビルダーパターンは、可読性を可能にすることです。私は個人的には、オプション2が最も読みやすいと感じています。オプション3も良いです。私はオプションの1つを避けるだろう。なぜなら、それはコレクションの平坦化を「欺く」ものだからだ。

各メソッドをそれぞれの行に置き、どのメソッドが最も直感的であるかを判断します。私はむしろ2番目のものを好きです:

final List<Double> B = list.stream() 
          .map(CoreResult::getField) 
          .flatMap(Collection::stream) 
          .collect(Collectors.toList()); 
0

オプション3と2は同じです。したがって、最初にフラットマップを作成したい場合や、フラットマップを作成したい場合は、これまでと同じです。

オプション1を使用すると、さらに操作を行うために別のストリームを開く必要があります。

7

あなたがList<List<Double>>を平らにしたい場合は、私はオプション2または3のために行くだろう、あなたはこれを行うだろう:

List<Double> list = doubleList.stream() 
           .flatMap(List::stream) 
           .collect(Collectors.toList()); 
関連する問題