「ストリームが閉じられました」エラーを回避するために Java でストリームを効率的にコピーするにはどうすればよいですか?

Patricia Arquette
リリース: 2024-11-05 08:22:02
オリジナル
160 人が閲覧しました

How to Efficiently Copy Streams in Java to Avoid

ストリームを効率的にコピーして「ストリームが閉じられた」エラーを防ぐ

Java 8 ストリームはデータ処理のための強力なメカニズムを提供しますが、それらは使い捨てです。同じデータに対して複数の操作が必要な場合、自然が問題を引き起こすことがあります。この問題は、「ストリームはすでに操作されているか、閉じられています」エラーとして現れます。

問題ステートメント:

上記のエラーを回避するために、一部の開発者はストリームの変換に頼っています。処理前にリストに追加します。このアプローチは機能しますが、効率が損なわれ、追加の手順が必要になる可能性があります。より洗練された効率的なソリューションを見つけることはできますか?

答え:

ストリームを保存するよりもコピーする方が効率的であるという仮定は、完全に正確ではありません。データを複数回再利用する必要がある場合は、ストレージまたはストリームの分割が必要です。

ストリームは、ループ融合などの単一使用シナリオに対して大幅な最適化を提供し、データ パイプライン全体の効率的な処理を可能にします。ただし、同じデータを再利用するには、データを 2 回生成するか、保存する必要があります。

Java ストリームで「フォークされたストリーム」を実装しようとすると、コストがかかることが判明し、まれな再利用の一般的な 1 回使用に負担がかかりました。課題は、2 つのパイプラインが異なるレートでデータを消費し、バッファリングが必要になる場合に発生します。

推奨されるアプローチ:

  • データの保存:再利用が不可欠な場合は、ストリーム データをコレクションなどに保存します。 Structure.
  • Use Consumers: 複数の操作を 1 つの Consumer に結合します。たとえば、ストリームを 2 回処理する代わりに、単一のコンシューマを使用して両方の操作を実行します:
<code class="java">stream()...stuff....forEach(e -> { consumerA(e); consumerB(e); });</code>
ログイン後にコピー

代替オプション:

  • RxJava: RxJava の処理モデルはストリーム フォークに適しています。ストリーム分割と複数のサブスクリプションのメカニズムを提供し、より複雑なデータ再利用シナリオを可能にします。

以上が「ストリームが閉じられました」エラーを回避するために Java でストリームを効率的にコピーするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート