web-dev-qa-db-ja.com

Iterableでストリーム関数を実行する方法は?

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操作を生成する他の方法はありますか?

32
The Coordinator

私の同様の質問は重複としてマークされましたが、ここでは、ボイラープレートの一部を回避するために使用したヘルパーメソッドを示します。

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);
}
36
Scott B

私はこれがあなたの質問に直接答えることはないことを知っていますが、コレクションなどのまともな数のIterableソースには、オブジェクトをストリームとして取得するメソッドもあります。

この質問で遭遇する摩擦は、Iterableが意味的にシリアルであるのに対し、Splitatorは並列処理に使用されることを意図していると思います。 Iterableのラッパーを使用するだけではStream APIが提供する利点を得ることができないため、JDKでまだ提供されていない場合は、関心のある基になるデータソースにSpliteratorを実装することをお勧めします。 (並列処理など)。

1
dsingleton

あなたが説明するものは、Iterableからストリームを取得する方法です。 Iterableにspliterator()メソッドを追加したのはそのためです。私は同じ変換を自分で行い、別の方法を見たことがありません。

[更新]たぶんこれ 他の答え は、「理由」についての説明を明らかにするでしょう。

1
Jay