web-dev-qa-db-ja.com

新しいコレクションにストリーミングするコレクション

コレクションをフィルター処理する最も簡単な方法を探しています。私は次のようなものを考えています

Collection<?> foo = existingCollection.stream().filter( ... ). ...

しかし、フィルターから別のコレクションを取得または追加するのに最適な方法はわかりません。ほとんどの例は「そしてここで印刷できます」のように思えます。可能性としては、コンストラクターまたは出力メソッドがありません。

46
xenoterracide

ほとんどの例がCollectionに結果を保存することを避ける理由があります。推奨されるプログラミング方法ではありません。既にCollectionがあります。ソースデータとコレクションを提供するものは、それだけでは役に立ちません。特定の操作を実行したいので、理想的なケースは、ストリームを使用して操作を実行し、中間のCollectionへのデータの保存をスキップすることです。これは、ほとんどの例が示唆しようとしていることです。

もちろん、Collectionsを扱う多くの既存のAPIがあり、常に存在します。したがって、Stream AP​​Iは、Collectionの需要を処理するさまざまな方法を提供します。

  • 結果を保持する任意のList実装を取得します。

    _List<T> results = l.stream().filter(…).collect(Collectors.toList());
    _
  • 結果を保持する任意のSet実装を取得します。

    _Set<T> results = l.stream().filter(…).collect(Collectors.toSet());
    _
  • 特定のCollectionを取得します。

    _ArrayList<T> results =
      l.stream().filter(…).collect(Collectors.toCollection(ArrayList::new));
    _
  • 既存のCollectionに追加:

    _l.stream().filter(…).forEach(existing::add);
    _
  • 配列を作成します。

    _String[] array=l.stream().filter(…).toArray(String[]::new);
    _
  • 配列を使用して、特定の特定の動作(可変、固定サイズ)でリストを作成します。

    _List<String> al=Arrays.asList(l.stream().filter(…).toArray(String[]::new));
    _
  • 並列対応ストリームが一時ローカルリストに追加し、後でそれらを結合できるようにします。

    _List<T> results
      = l.stream().filter(…).collect(ArrayList::new, List::add, List::addAll);
    _

    (注:これはCollectors.toList()の現在の実装方法と密接に関連していますが、これは実装の詳細です。つまり、toList()コレクターの今後の実装がArrayList

114
Holger

_Java.util.stream_のドキュメントの例:

_List<String>results =
     stream.filter(s -> pattern.matcher(s).matches())
           .collect(Collectors.toList());
_

CollectorsにはtoCollection()メソッドがあります。この方法をお勧めします。

4
Samy Dindane

Java 8スタイルの関数型プログラミングに沿った例):

Collection<String> a = Collections.emptyList();
List<String> result = a.stream().
     filter(s -> s.length() > 0).
     collect(Collectors.toList());
3
nobeh