Java 8:遅延操作のAPIでストリームを渡すことをお勧めしますか?


12

GuavaなどのJava 8より前のラムダヘビーライブラリでは、出力は共通のJava Collection Frameworkインターフェイスを使用するため、外部/内部APIに簡単に渡すことができ、ライブラリメソッドがそれを実行する場合(レイジーfilter()およびtransform())でも遅延計算を利用できます。

ただし、Java 8 Streamsでは、Collection/ を取得する呼び出しMapはターミナル(つまり、熱心)であり、結果を保持するために新しいデータ構造も割り当てます。

中間に複数のステージと戦略パターンがある複雑な計算では、中間結果のために多くの不必要な割り当てが発生します。

だから、人々は内部API(すなわち戦略パターン戦略)がStreams を取得して返すのが良い習慣だと思うのですか、それとも単に怠け者にフォールバックする必要がありますか?

編集:

私の主な関心事Streamは、それが一度だけ消費され、Supplier<Stream<X>>非常に面倒に見えるようなものを渡すことができるということです。それはほとんどあなただけ渡すためにプッシュしCollection、その後、再stream()それを(その時点での先行評価のコストを支払います)。


ネイティブストリームを利用するために、グアバと友人は更新されていませんか?
キリアンフォス

1
ストリームを取得および返すインターフェイスを持つことにより、標準のストリーム機能との相互運用性が本当に向上します。インターフェイスへの呼び出しをストリームパイプラインに統合できます。
フィリップ

@KilianFothほぼ1年間Guavaのリリースはなく、GuavaのラムダをStreamに置き換えることに関する多くの人気記事があります。ただし、グアバ収集作業が熱心または怠zyであるという事実に対処するものはありません。
billc.cn

回答:


3

Java 8 Streamsの遅延は、グアバのIterableで使用したのと同じように機能します。Iteratorからコレクションを構築すると、遅延を維持するためにIterableを渡さなければならず、評価が発生します。ストリームとイテレータは両方とも一度しか使用できません。

そのため、メソッドインターフェイスの場合、より一般的な方法(遅延を許可する)は、Streamインターフェイスを使用することです(以前にIterableを使用したことがある場合はいつでも)。@Philippが言うように、これにより、ストリームパイプラインで使用できるようになります。

現在、Streamは公式のJava標準インターフェイスであるため、Streamsで直接効率的に作業できる他のライブラリと関数がますます増えることを願っています。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.