私はjava-8ストリームを詳細に理解しようとしています。 streams上のOracleのドキュメントページからjava-8ストリーム:中間操作の新しいストリームはメモリの増加なしに返されますか?
:
はストリームは、いくつかの方法でのコレクションとは異なります。
ないストレージ。ストリームは、要素を格納するデータ構造ではありません。代わりに、データ構造、配列、ジェネレータ関数、またはI/Oチャネルなどのソースから計算操作のパイプラインを通じて要素を伝達します。
ストリーム操作とパイプライン
ストリーム操作は、中間および端末操作に分割され、ストリームパイプラインを形成するために結合されます。
ストリームパイプラインは、ソース(コレクション、配列、ジェネレータ関数、またはI/Oチャネルなど)で構成されます。続いてStream.filterやStream.mapのようなゼロ以上の中間的な操作が続きます。 Stream.forEachやStream.reduceのような端末操作が含まれます。
中級操作が
は別にドキュメントから、私は関連のSEの質問を経てきた新しいストリームを返す:どこ
How does streams in Java affect memory consumption?
それは、追加のメモリがなかったことを引用しました。ストリーム操作のパイプライニングのために消費されます。元のストリームはパイプラインを通過します。
Benjaminブログから一つの作業例:
List<String> myList =
Arrays.asList("a1", "a2", "b1", "c2", "c1");
myList
.stream()
.filter(s -> s.startsWith("c"))
.map(String::toUpperCase)
.sorted()
.forEach(System.out::println);
しかしfilter, map and sorted
のような中間の操作が新しいストリームを返すとき、どのように来ることは、メモリの消費量を増加させませんか?私はここに何かを逃していますか
作成されたオブジェクトの寿命が短く、ガベージコレクタが非常に優れています。 – Tunaki
すべての要素を並べ替えるには、その要素をすべて格納しておく必要があります。 –