問題タブ [spliterator]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - stream.spliterator() はストリームを閉じますか?
stream.spliterator()
は暗黙的に を閉じますかstream
、それとも後で明示的に閉じる必要がありますか?
一見すると、この.spliterator()
メソッドは を閉じているように見えますが、stream
は呼び出されていませんstream.close()
。少なくとも、メソッドが呼び出された後にすぐに閉じると.spliterator()
、スプリッテレータ操作には影響がないようです。
この質問はstream
、たとえば.findAny()
.
その質問の理由は、stream
明示的に閉じる必要がある場合と、明示的に閉じる必要がない場合に、onClose()
定義されたアクションがいつ実行されるかを明確にするためです。
java - Java 8 および Java 9 の順次ストリーム スプリッテレータと並列ストリーム スプリッテレータを理解する
一見簡単ではないスプリッテレータに関する質問です。
ストリームで.parallel()
は、ストリームが処理される動作を変更します。ただし、順次ストリームと並列ストリームから作成されたスプリッテレータは同じであると予想していました。たとえば、通常、順次ストリームで.trySplit()
は が呼び出されることはありませんが、並列ストリームではスプリット スプリッテレータを別のスレッドに渡すために呼び出されます。
stream.spliterator()
vsの違いstream.parallel().spliterator()
:
それらには異なる特性がある場合があります。
/li>
ここで説明されている別のナンセンスなストリームスプリッター特性ポリシー(並行して計算された方が良いようです)のようです:Java 8およびJava 9でのスプリッテレーター特性の理解
を使用した分割に関して、それらは異なる動作をする場合があります
/li>.trySplit()
。
最後の 2 つの動作が異なるのはなぜですか? シーケンシャル ストリームを分割したいのに分割できないのはなぜですか? (たとえば、高速処理のために分割の 1 つを破棄すると便利な場合があります)。
スプリッテレータをストリームに変換するときの大きな影響:
/li>
この場合、スプリッテレータは分割機能を無効にするシーケンシャル ストリームから作成されました ( .trySplit()
null を返します)。後でストリームに戻す必要がある場合、そのストリームは並列処理の恩恵を受けません。残念なこと。
大きな問題:回避策として、呼び出す前に常にストリームを並列に変換することの主な影響は何ですか?.spliterator()
java - Consumer 関数によって例外がスローされた後、Spliterator を再利用可能にする必要がありますか?
Spliterator
andメソッドで任意のConsumer
関数を取ります。tryAdvance
forEachRemaining
コンシューマが例外をスローした場合、スプリッテレータの状態はどうあるべきですか? に渡されたコンシューマーがforEachRemaining
10 個のアイテムの後に例外をスローした場合 (その後、伝播されてキャッチされます)、tryAdvance
スプリッテレーターでの次の呼び出しは 11 番目のアイテムを返す必要がありますか、それともスプリッテレーターはその時点で無効で無効であると見なされますか?
この点に関して、javadoc はあいまいです。彼らは、その時点を過ぎたスプリッテレータの状態を参照せずに、例外が伝播されると言っているだけです
java - イテレータから作成された CompletableFuture ストリームが遅延評価されない
私は、完了可能な先物がいつどのように完成するかについて少し苦労しています。このテスト ケースを作成しました。
出力は次のとおりです。
testList
メソッドは期待どおりに機能します。はCompletableFuture
最後にのみ評価されるため、 limit メソッドの後は最初の 2 つの項目のみが保持されます。
しかし、そのtestIterator
方法は予想外です。すべてCompletableFuture
の 's が完了し、制限が行われるのは後でのみです。
parallel()
ストリームからメソッドを削除すると、期待どおりに機能します。ただし、forEach()
私の完全なプログラムでは長時間実行されるメソッドであるため、処理 ( ) は並行して実行する必要があります。
なぜこれが起こっているのか説明できる人はいますか?
これは Java のバージョンに依存しているように見えるので、私は 1.8 を使用しています。