Java 8では、Stream
クラスにはIterable
をラップするメソッドがありません。
代わりに、Spliterator
からIterable
を取得し、次にStream
からStreamSupport
を取得しています。
boolean parallel = true;
StreamSupport.stream(spliterator(), parallel)
.filter(Row::isEmpty)
.collect(Collectors.toList())
.forEach(this::deleteRow);
Stream
に対してIterable
操作を生成する他の方法はありますか?
私の同様の質問は重複としてマークされましたが、ここでは、ボイラープレートの一部を回避するために使用したヘルパーメソッドを示します。
public static <T> Stream<T> stream(Iterable<T> in) {
return StreamSupport.stream(in.spliterator(), false);
}
public static <T> Stream<T> parallelStream(Iterable<T> in) {
return StreamSupport.stream(in.spliterator(), true);
}
私はこれがあなたの質問に直接答えることはないことを知っていますが、コレクションなどのまともな数のIterableソースには、オブジェクトをストリームとして取得するメソッドもあります。
この質問で遭遇する摩擦は、Iterableが意味的にシリアルであるのに対し、Splitatorは並列処理に使用されることを意図していると思います。 Iterableのラッパーを使用するだけではStream APIが提供する利点を得ることができないため、JDKでまだ提供されていない場合は、関心のある基になるデータソースにSpliteratorを実装することをお勧めします。 (並列処理など)。
あなたが説明するものは、Iterableからストリームを取得する方法です。 Iterableにspliterator()メソッドを追加したのはそのためです。私は同じ変換を自分で行い、別の方法を見たことがありません。
[更新]たぶんこれ 他の答え は、「理由」についての説明を明らかにするでしょう。