コレクションをフィルター処理する最も簡単な方法を探しています。私は次のようなものを考えています
Collection<?> foo = existingCollection.stream().filter( ... ). ...
しかし、フィルターから別のコレクションを取得または追加するのに最適な方法はわかりません。ほとんどの例は「そしてここで印刷できます」のように思えます。可能性としては、コンストラクターまたは出力メソッドがありません。
ほとんどの例がCollection
に結果を保存することを避ける理由があります。推奨されるプログラミング方法ではありません。既にCollection
があります。ソースデータとコレクションを提供するものは、それだけでは役に立ちません。特定の操作を実行したいので、理想的なケースは、ストリームを使用して操作を実行し、中間のCollection
へのデータの保存をスキップすることです。これは、ほとんどの例が示唆しようとしていることです。
もちろん、Collection
sを扱う多くの既存のAPIがあり、常に存在します。したがって、Stream
APIは、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
)
_Java.util.stream
_のドキュメントの例:
_List<String>results =
stream.filter(s -> pattern.matcher(s).matches())
.collect(Collectors.toList());
_
Collectors
にはtoCollection()
メソッドがあります。この方法をお勧めします。
Java 8スタイルの関数型プログラミングに沿った例):
Collection<String> a = Collections.emptyList();
List<String> result = a.stream().
filter(s -> s.length() > 0).
collect(Collectors.toList());