問題タブ [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 - Spliterator の getExactSizeIfKnown() が hasCharacteristics() を呼び出さないのはなぜですか
Spliterator
クラスのソース (JDK 1.8.0_40)では、メソッドを呼び出すだけでなく、直接メソッドを呼び出して が含まれているかどうかを確認することにより、操作対象のインスタンスが特性を持っているかどうかを確認するためのdefault
実装を確認します。ほとんど同じことを行う実装。getExactSizeIfKnown()
SIZED
abstract characteristics()
SIZED
hasCharacteristics(SIZED)
default
getExactSizeIfKnown()
次のように実装されていない理由はありますか:
これは私にとってより明確に読み取れ、デフォルトの動作のオーバーライドをより適切に処理しているようです(現在、hasCharacteristics(int)
何か奇妙なものにオーバーライドされている場合、おそらくオーバーライドする必要があるという兆候はありませんgetExactSizeIfKnown()
)?
私がここに欠けているものはありますか?このようなメソッド間でチェックを複製するのはなぜですか?
java - Stream を順次実行するように制限し、並行して実行しないようにするにはどうすればよいですか?
カスタム スプリッテレータから生成されたストリームを返すメソッドがあります。スプリッターはトレッドセーフではありません。スプリッテレータはトレッド セーフではなく、状態を維持するため、並列実行を防止したいと考えています。返されたストリームが並行して実行されないようにする方法はありますか?
これを行うドキュメントや例を見つけることができませんでした。sequential()
クラスでメソッドを見つけましたBaseStream
が、ユーザーが呼び出しparallel()
て並列ストリームを取得することを妨げているようには見えません。
java - フィボナッチ数をストリーミングするための Spliterator を実装する方法は?
私は Java 8 Spliteratorで遊んでいて、指定された n までフィボナッチ数をストリーミングするものを作成しました。フィボナッチ数列の場合0, 1, 1, 2, 3, 5, 8, ...
以下は、スタックメモリが不足する前に1の束を出力する私の実装です。バグを見つけるのを手伝ってもらえますか? (進んでいないと思いますcurrentIndex
が、どの値に設定すればよいかわかりません)。
編集1:答えることにした場合は、質問に関連したものにしてください。この質問は、効率的なフィボナッチ数の生成に関するものではありません。スプリッテレータを学習することです。
フィボナッチスプリッター:
フィボナッチペア:
使用法:
java - スーパー クラス、親ファイル、コンポーネントの親、リンクされたリストなどの Java 8 ストリーム
for
次のステートメントを Java 8 ストリーム (つまり)に変換したいと思いStream<Class<?>>
ます。File.getParentFile()
理想的な解決策は、リンクされたリストをトラバースするさまざまな状況 (例: )に簡単に適応できるほど単純なものですComponent.getParent()
。
ストリームを作成するための数行のコードは、単一のfor
ステートメントよりも単純ではないことに気付きました。ただし、ストリームを使用するとfor
ループの本体が単純になるため、ストリームの方が望ましいと言えます。
java - Iterable で Steam.spliterator を使用して作成された (2 回目の) ストリームを反復処理できません
Steam.spliterator で作成されたストリームを (2 回目) 繰り返すことができません。同じことに関するドキュメントが見つかりませんでした。
これが私がやっていることです:
Iterable
as funciton引数を取得し、次のコードのようにストリームを介してこれを繰り返しています:
その後、私はそれをもう一度やっていますが、2番目のものはまったく反復しません。私はそれをデバッグするのに多くの時間を費やし、最終的に最初に iterable をリストに変換しました。
どなたか理由をご存知ですか?
編集:明確でない場合は申し訳ありませんが、
ストリームを複数回使用していませんでした。同じ Iterable を使用して上記の方法でストリームを生成していました。
Iterable は、MapReduce ジョブの reduce から来るものです。
ありがとう、ハリンドラ
java - 汎用ページング スプリッテレータを作成するにはどうすればよいですか?
ページでアクセスする必要があるソースから読み取る Java ストリームを処理できるようにしたいと考えています。最初のアプローチとして、現在のページの項目がなくなったときにページを要求するだけのページング イテレータを実装し、StreamSupport.stream(iterator, false)
イテレータを介してストリーム ハンドルを取得するために使用しました。
ページの取得にかなりのコストがかかることがわかったので、並列ストリームを介してページにアクセスしたいと考えています。この時点で、Java がイテレーターから直接提供するスプリッテレーター実装のために、私の素朴なアプローチによって提供される並列処理が存在しないことを発見しました。私は実際にトラバースしたい要素についてかなり多くのことを知っているので(最初のページをリクエストした後の合計結果数を知っており、ソースはオフセットと制限をサポートしています)、達成する独自のスプリッテレータを実装できるはずです実際の並行性 (ページの要素で行われる作業とページのクエリの両方)。
「要素で行われた作業」の同時実行性を非常に簡単に達成できましたが、最初の実装では、ページのクエリは最上位のスプリッテレータによってのみ行われるため、作業の分割によるメリットはありません。 fork-join 実装によって提供されます。
これらの両方の目標を達成するスプリッテレータを作成するにはどうすればよいですか?
参考までに、これまでに行ったことを提供します (クエリが適切に分割されていないことはわかっています)。
そして私のページのソース:
そしてページ:
そして、テスト用に「遅い」ページングでストリームを取得するサンプル