問題タブ [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 - 遭遇注文コレクション - ベスト プラクティスと例
注文
ストリームには、定義された遭遇順序がある場合とない場合があります。ストリームに遭遇順序があるかどうかは、ソースと中間操作によって異なります。特定のストリーム ソース (List や配列など) は本質的に順序付けられていますが、他のストリーム ソース (HashSet など) はそうではありません。sorted() などの一部の中間操作は、順序付けされていないストリームに遭遇順序を課す場合があり、BaseStream.unordered() などのように、順序付けられたストリームを順序付けされていない状態でレンダリングする場合があります。さらに、一部の端末操作は、forach() などの検出順序を無視する場合があります。
- 遭遇順序プロパティを持たない他のタイプはあります
HashSet
か? - 既存の順序や並べ替えを維持することに興味がない場合、並列に計算される各ストリームで中間操作を明示的に呼び出すことはベストプラクティスと見なされますか?
unordered
java - どのコレクション - 各操作のスプリッテレータが繰り返していますか?
各操作のスプリッテレータが反復処理しているものを正確に理解しようとしています。私が間違っている場合は訂正してください: (私はおそらく間違っています)
- 各ストリームには
.spliterator()
メソッドがあります。 - 各中間操作は、スプリッテレータの特性を変更できます。
私の質問:
- 各中間操作は、同じスプリッテレータ (「ソース スプリッテレータ」) で特性を使用および変更しますか?
- 操作を使用している場合は
filter
、一部の要素を省略できます。それらの要素が正確に省略されているコレクションはどれですか?
java - スプリッテレータの特徴を深く理解する
Javaストリームとスプリッテレータを深く理解しようとするために、スプリッテレータの特性についていくつかの微妙な質問があります:
Q1:Stream.empty()
対Stream.of()
(引数なしの Stream.of())
Stream.empty()
:サブサイズ、サイズStream.of()
: SUBSIZED, IMMUTABLE , SIZED, ORDERED
Stream.empty()
が と同じ特性を持たないのはなぜStream.of()
ですか? Stream.concat() と組み合わせて使用すると影響があることに注意してください (特に を持たない場合ORDERED
)。IMMUTABLE と ORDEREDだけでなく、DISTINCT と NONNULLもStream.empty()
必要だと思います。また、DISTICTを持つ引数が1つだけでも意味があります。Stream.of()
Q2: NONNULLLongStream.of()
がない
では NONNULL を使用できないことに気付きましたLongStream.of
。NONNULL
すべてLongStream
の 、 、IntStream
の主な特徴ではありませんDoubleStream
か?
Q3: LongStream.range(,)
vsLongStream.range(,).boxed()
LongRange.range(,)
: SUBSIZED、IMMUTABLE、NONNULL、SIZED、ORDERED、SORTED 、DISTINCTLongStream.range(,).boxed()
: SUBSIZED、SIZED、ORDERED
なぜ.boxed()
これらすべての特性を失うのですか?それは失うべきではありません。
NONNULL、IMMUTABLE、および DISTICT.mapToObj()
を失う可能性があることは理解していますが、...意味がありません。.boxed()
Q4: IMMUTABLE と NONNULL を.peek()
失う
LongStream.of(1)
: SUBSIZED、IMMUTABLE、NONNULL、SIZED、...
LongStream.of(1).peek()
: SUBSIZED、SIZED、...
なぜ.peek()
これらの特性を失うのですか?.peek
本当に負けてはいけません。
Q5: .skip()
、SUBSIZED、IMMUTABLE、NONNULL、SIZED を.limit()
失う
これらの操作ではSUBSIZED、IMMUTABLE、NONNULL、SIZEDが失われることに注意してください。なんで?サイズが利用可能な場合は、最終的なサイズも簡単に計算できます。
Q6: IMMUTABLE、NONNULL を.filter()
失う
この操作はSUBSIZED、IMMUTABLE、NONNULL、SIZEDも失うことに注意してください。SUBSIZED と SIZEDを失うのは理にかなっていますが、他の 2 つは意味がありません。なんで?
スプリッテレータを深く理解している人が明確にすることができれば幸いです。ありがとう。
java - .flatMap() が非常に非効率的である (怠惰ではない) のはなぜですか?
ここでJava ストリーム スプリッテレータを深く理解することに関する最初の質問の後、ストリームに関する別の微妙な質問: なぜ.flatMap()
Java での実装は非常に非効率的 (非遅延) なのですか?
通常、ストリームは可能な限り遅延する必要がありますが、.flatMap()
メソッドはそうではありません。
例えば:
stream.flatMap(this::getStreamWith10HeavyComputationElems).firstFirst()
最初の重い計算結果を返す前に、10 要素 (10 回の重い計算) を消費します。
stream.flatMap(this::getStreamWith10HeavyComputationElems).limit(11).count()
11 を返す前に 20 要素 (2x10 の重い計算) を消費します。
問題は、Java が非遅延実装を使用する理由です。
回避策として、flatMap の独自の実装を作成しましたが、ネイティブの呼び出し: flatMap(stream, mapper)
vs nativeと比較して流暢さに欠けstream.flatMap(mapper)
ます。