問題タブ [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 - Javaのスプリッテレータから次の要素を返す方法
次の要素で「アクションを実行」するだけでなく、スプリッテレータから次の要素を取得したい。たとえば、次のメソッドを実装することによって
私が見つけたすべての検索結果は、tryAdvance() がイテレータ hasNext() と next() の組み合わせのようなものであるとだけ言っていましたが、次の要素を取得できないため、「次の要素でアクションを実行する」だけなので、それは大きな嘘です。
java - 変更された基になるコレクションのスプリッテレータ
これが本番環境で発生することは決してないことはわかっていますが、Spliterators に関するいくつかの複雑な詳細を理解しようとしており、次の「パズル」に出くわしました (少なくとも私にとってはパズルです)。
(スニペット 1)
このコードは456123
、期待どおりに出力します (咳私はすでに a を期待していましたが、咳ConcurrentModificationException
の動作を理解しています)。つまり、リストに Spliterator を作成し、リストに 6 つの要素がある場合に分割されます。 .
私が理解していないのは次のとおりです。
(スニペット 2)
私はこのコードが失敗することを期待してConcurrentModificationException
います. に変更された場合、値とがこのそれぞれの順序で例外の前に配置されていることがわかります。s1.forEachRemaining
34
System.err::println
3
4
PrintStream
今クレイジーな部分:
(スニペット 3)
s1
スニペット 2 と 3 の間の唯一の変更点は、およびにアクセスする順序であることに注意してくださいs2
。スニペット 3 はまだ aConcurrentModificationException
で失敗しますが、出力される値は1
と2
です。これは、s2.forEachRemaining
!の行で例外が発生したためです。
私が正しく理解していれば、何が起こるか:
- Spliterator が初期化される
- 分割が完了しました
- 反復が起こる
- 反復中に、最後の分割が行われた後に、基礎となるコレクションに変更があったことが観察されます
これは、Spliterator も Streams と同様に「怠惰」であることを意味しますか? ただし、この議論は、複数の分割を実験する場合、つまり、
(スニペット 4)
s1
その後、問題なく評価され、 の処理中に例外がスローされるはずですが、 !s2
の処理中に既に例外がスローされます。s1
ヘルプやポインタをいただければ幸いです。
詳細: 問題があれば、Eclipse 2019-06 (4.12.0) の Windows で AdoptOpenJDK 11.0.4+11 (64 ビット) でスニペットを実行します。
java - Hashmap.values().parallelStream() が並列に実行されないのはなぜですか?
ハッシュマップには 2 つのキーと値のペアがあり、異なるスレッドによって並行して処理されることはありません。
出力:
URL: https://ideone.com/Hkxkoz
ValueSpliterator は、HashMap の配列をサイズ 1 のスロットに分割しようとする必要があります。これは、2 つの要素を異なるスレッドで処理する必要があることを意味します。
ソース: https://www.codota.com/code/java/methods/java8.util.HMSpliterators $ValueSpliterator/%3Cinit%3E
でラップした後ArrayList
、期待どおりに動作します。
出力: