内部でJava 8ストリームを使用したソートはどのように機能しますか?


10

私が呼び出すStream.sort(..)と、作成された要素の新しい配列があり、ストリームは新しく作成されたソートされた配列を反復処理しますか?

言い換えれば、Java 8 Streamは内部でどのように機能sortするのでしょうか。


なぜ私はこの質問で反対票を投じるのですか???
InformedA 2016

2
あなたの質問は合理的であり、反対票に値しません。アモンの答えについてのあなたのコメント、しかし... ugh:|
Andres F.

@AndresF。私がそのコメントをする前でさえ、反対票が出ました。それが私がとても動揺した理由の一つです。
InformedA 2016年

いずれにしても、コメントは反対票を投じる理由にはなりません。質問はそれ自体のメリットに基づいており、私の意見ではそれは有効です。私はそれを賛成した。
アンドレスF.16年

回答:


10

grepcode.comを使用して、Java標準ライブラリコード(およびその他のライブラリ)を検索できます。残念ながら、ストリーム実装コードはかなり抽象的です。良い出発点は、ストリームをソートされたストリームに変換する内部java.util.stream.SortedOpsクラスです。

現在の実装ストリームが既にソートされている場合(標準ライブラリコンテナのストリームに対して使用される)はノー・オペレーションになり、ストリームのサイズが既知である場合(アレイを使用してSizedRefSortingSink)、またはサイズである場合のArrayList内のすべての要素を蓄積不明(RefSortingSink)。

もちろん、そのような実装の詳細はリリースによって変わる可能性がありますが、基本的な考慮事項は普遍的です:ストリームのソートは必然的に熱心な/ブロッキング操作であり、無限ストリームのソートは意味がありません。つまり、ストリームを使用する場合、ストリームは遅延する可能性があるため、ストリームのソートは役に立ちませんが、便利なストリーム構文を取得できます。

他のストリームは、独自のの実装を提供する必要Stream.sorted()があります。


1
@InformedAラムダまたはストリームが「ボンネットの下ででたらめ」になることを提案したくありません。ストリームに関する詳細は、他のJavaの概念と比べて非常に複雑ですが、どちらも非常に便利です。これらのツールが役に立たないか有害であるという先入観の概念に固執したい場合は、不必要に自分を制限していることになります。
アモン

1
@amon-同意。さらに、ストリームは、アプリケーションを実質的に変更することなく、内部でマルチコア並列実装をローリングする可能性を提供します。そして、ストリームの実装の複雑さは、まさにそのためです。それは単なる便利さだけではなく、まさに抽象化です。OPに- ラムダとストリームが便利な機能よりもはるかに多い理由を理解したい場合は、「ラムダをマスターする」を読むことをお勧めします。
Yuri Steinschreiber

3
@InformedA:ラムダは約80年前から存在しており、現在のほとんどすべての主流のプログラミング言語に存在しています。ストリームは約40年前から存在しており、同様にほとんどすべてのメインストリームコレクションフレームワークに存在しています。それらは異なるもの(イテレータ、レイジーリスト、列挙子、列挙可能)と呼ばれる場合がありますが、それらは存在します。ラムダとレイジーリストは、そこに存在する最も古くて最も安定した抽象概念の一部であり、それらは、流行、誇大宣伝、パラダイム、運動、方法論、技術、言語、OS、フレームワーク、ライブラリがスローされても、すべて生き残っています。それは一見の価値があります。
イェルクWミッターク

2
@InformedA Java(プログラミング言語)は、JVMで実行されているバイトコードの単純な抽象です。JVM自体は、C(またはC ++、忘れてしまいました)で書かれたでたらめな抽象概念です。CとC ++は、アセンブリ言語に対する単なるでたらめな抽象化です。アセンブリ言語自体でさえ、マイクロコード上のでたらめな抽象化です。これは、回路でのでたらめな抽象化であります(間に、いくつかのステップが抜けている可能性があります)。ソフトウェアで有用なものはすべて、何か他のものに対する「でたらめの抽象」であると言えるでしょう。
Andres F.

3
@InformedA私の正直なアドバイスは、Javaよりも関数型プログラミングを指向した言語を学ぼうとすることです。日常業務に使用しない場合でも、Javaで役立つプログラミング言語とその設計の選択を理解できます:)
Andres F.
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.