私はいくつかの苦情をすることを許可してください、たぶんそれは退屈ですが、私は説明したい: "この質問はなぜ起きましたか?"。 昨夜、質問に答えた人はhere、here、hereです。 JDK-9と.etcでStream#map & Collectors#mapping、Stream#filter & Collectors#filtering:私はそれを掘り下げる取得した後ストリーム操作がコレクタと重複しているのはなぜですか?
は、私がStreamとDon't repeat yourself原則に違反しCollector、例えば間に多くの重複のロジックがある見つけました。
しかしStreamがTell, Don't ask原則/ Law of Demeterを順守し、CollectorComposition over Inheritance原則を順守するので、それは合理的に思えます。
私だけStream操作がCollector秒以下のようにして複製され、いくつかの理由を考えることができます。
我々はStreamが大きなコンテキストで作成されたかを気にしません。それは例えば、単に別のStreamにStreamをマッピングすることができるので、この場合にStream動作をより効果的かつ迅速Collectorより:
consuming(stream.map(...)); consuming(stream.collect(mapping(...,toList())).stream()); void consuming(Stream<?> stream){...}
Collector缶は、ストリーム内の要素を収集するCollectorが一緒だ構成がより強力ですしかしながら、Streamは、いくつかの有用な/高度に使用される操作しか提供していない。例えば:いくつかの単純な作業を行うとき
stream.collect(groupingBy( ..., mapping( ..., collectingAndThen(reducing(...), ...) ) ));
Stream操作がCollectorよりも表現力であるが、それは、各操作のための新しいストリームを作成し、Streamがより重く、抽象的であるため、彼らはCollector秒より遅いですCollector。例えば:
stream.map(...).collect(collector); stream.collect(mapping(..., collector));
CollectorはStreamとして短絡端子操作を適用することはできません。例えば:ストリームの操作はここではコレクターで複製され、なぜ誰もが、他の欠点/利点と
stream.filter(...).findFirst();
まで来ることができていますか?私はそれらを再理解したいと思います。前もって感謝します。
それは彼らがそれを設計した方法なので。苦情があった場合は、バグ報告や改善依頼を提出するか、ホールを雇う。 – EJP
も参照してください。[Collectors.summingInt()vs mapToInt().sum()](https://stackoverflow.com/q/37023822/2711488) – Holger
@Holgerリンクのおかげで、私はほとんどの時間を要する私は英語が上手ではないので、あなたのものです。 –