Stream.sort(..)
を呼び出すと、要素の新しい配列が作成され、ストリームは新しく作成されたソート済み配列を反復処理しますか?
言い換えれば、Java 8 Streamはどのように内部でsort
を実行しますか?
grepcode.com を使用してJava標準ライブラリコード(および他のいくつかのライブラリ)を検索できます。残念ながら、ストリーム実装コードはかなり抽象的です。ポイントは内部 _Java.util.stream.SortedOps
_クラス であり、ストリームをソートされたストリームに変換します。
現在の実装 (標準ライブラリコンテナのストリームに使用)は、ストリームがすでにソートされている場合は何もしないようにし、ストリームのサイズがわかっている場合は配列を使用します( SizedRefSortingSink
)、またはサイズが不明な場合はArrayListのすべての要素を累積します( RefSortingSink
)。
もちろん、そのような実装の詳細はリリースによって変わる可能性がありますが、基本的な考慮事項は普遍的です:ストリームのソートは必然的に熱心な/ブロッキング操作であり、無限ストリームのソートは意味がありません。つまり、ストリームを使用する場合、ストリームを並べ替えることは役に立たないことがあります。これは、ストリームが遅延する可能性があるためですが、便利なストリーム構文が得られます。
他のストリームはStream.sorted()
の独自の実装を提供する必要がありますが、これは類似している可能性があります。