問題タブ [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.

0 投票する
3 に答える
376 参照

java - Javaのスプリッテレータから次の要素を返す方法

次の要素で「アクションを実行」するだけでなく、スプリッテレータから次の要素を取得したい。たとえば、次のメソッドを実装することによって

私が見つけたすべての検索結果は、tryAdvance() がイテレータ hasNext() と next() の組み合わせのようなものであるとだけ言っていましたが、次の要素を取得できないため、「次の要素でアクションを実行する」だけなので、それは大きな嘘です。

0 投票する
1 に答える
115 参照

java - 変更された基になるコレクションのスプリッテレータ

これが本番環境で発生することは決してないことはわかっていますが、Spliterators に関するいくつかの複雑な詳細を理解しようとしており、次の「パズル」に出くわしました (少なくとも私にとってはパズルです)。

(スニペット 1)

このコードは456123、期待どおりに出力します (私はすでに a を期待していましたが、ConcurrentModificationExceptionの動作を理解しています)。つまり、リストに Spliterator を作成し、リストに 6 つの要素がある場合に分割されます。 .

私が理解していないのは次のとおりです。

(スニペット 2)

私はこのコードが失敗することを期待してConcurrentModificationExceptionいます. に変更された場合、値とがこのそれぞれの順序で例外の前に配置されていることがわかります。s1.forEachRemaining34System.err::println34PrintStream

今クレイジーな部分:

(スニペット 3)

s1スニペット 2 と 3 の間の唯一の変更点は、およびにアクセスする順序であることに注意してくださいs2。スニペット 3 はまだ aConcurrentModificationExceptionで失敗しますが、出力される値は12です。これは、s2.forEachRemaining!の行で例外が発生したためです。

私が正しく理解していれば、何が起こるか:

  • Spliterator が初期化される
  • 分割が完了しました
  • 反復が起こる
    • 反復中に、最後の分割が行われたに、基礎となるコレクションに変更があったことが観察されます

これは、Spliterator も Streams と同様に「怠惰」であることを意味しますか? ただし、この議論は、複数の分割を実験する場合、つまり、

(スニペット 4)

s1その後、問題なく評価され、 の処理中に例外がスローされるはずですが、 !s2の処理中に既に例外がスローされます。s1

ヘルプやポインタをいただければ幸いです。

詳細: 問題があれば、Eclipse 2019-06 (4.12.0) の Windows で AdoptOpenJDK 11.0.4+11 (64 ビット) でスニペットを実行します。

0 投票する
2 に答える
344 参照

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、期待どおりに動作します。

出力: