web-dev-qa-db-ja.com

Java 8ストリームでの並べ替えは、内部ではどのように機能しますか?

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

言い換えれば、Java 8 Streamはどのように内部でsortを実行しますか?

10
InformedA

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

現在の実装 (標準ライブラリコンテナのストリームに使用)は、ストリームがすでにソートされている場合は何もしないようにし、ストリームのサイズがわかっている場合は配列を使用します( SizedRefSortingSink )、またはサイズが不明な場合はArrayListのすべての要素を累積します( RefSortingSink )。

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

他のストリームはStream.sorted()の独自の実装を提供する必要がありますが、これは類似している可能性があります。

10
amon