ストリーム:副作用私は完全には理解できないのOracleドキュメントのいくつかのものがあります
Operations like forEach and peek are designed for side effects;
彼らは「設計された」の意味は何?これらの2つについては何が特別ですか?私は任意のストリームAPIメソッドが副作用を介して動作するように自分のコードを書くことができます。私が理解できる限り、それは完全に私のものです。さらに、私は通常、ソース自体ではなく要素の状態を変更するためにpeek()を使用しますが、ステートフルまたは副作用の原因にはなりません。
のforEachのjavadocも書かれています:
The behavior of this operation is explicitly nondeterministic.
彼らはfindAnyについて同じことを言うとき、私はそれを理解しますが、何がforEachのおよそ非決定ですか?パラレル・ストリームでの操作は、ストリームが順序付けられていない場合は順序付けを保証できません。非決定論はなぜforEach(とfinAny、しかしそれはちょっと別のことを意味する)について言及されていますか? PEEKとのforeachのjavadocについては
も含まれています
action may be performed at whatever time and in whatever thread the library chooses
ここでも、なぜそこだけ?それは残りの操作についてはなぜ言及されていないのですか?
まあ、あなたの質問の2つのポイントは実際にそれに答える。通常の中間作業では、副作用や干渉のないものでなければならないため、非決定性は無関係です。 'forEach'では、"副作用のために設計されている "ため、非決定性は重要であり、文書化されなければなりません。 – Holger
正解を求めているのはあなた次第です。この仕様では、ほとんどのストリームメソッドに渡されるビヘイビアパラメータが_stateless_であることを明確に述べています。つまり、計算に影響する可能性のある副作用がある場合、正しい答えを得る保証はありません。 –
したがって、「副作用のために設計された」とは、実際には、副作用に対して弾力性を持たせるために、peekとforEachの実装に何かがあることを意味しますが、残りの機能は同じことを保証できません。 – yuranos87