Ich versuche, Java-8-Streams im Detail zu verstehen.Java-8-Streams: Werden neue Streams von Zwischenoperationen ohne Speichererweiterung zurückgegeben?
von Oracle-Dokumentation Seite auf streams:
Streams unterscheiden sich von Sammlungen in mehrfacher Hinsicht:
Keine Lagerung. Ein Stream ist keine Datenstruktur, die Elemente speichert. Stattdessen überträgt es Elemente aus einer Quelle wie einer Datenstruktur, einem Array, einer Generatorfunktion oder einem E/A-Kanal durch eine Pipeline von Rechenoperationen.
Stream-Operationen und Pipelines
Stream-Operationen werden in Zwischen- und Operationen unterteilt und werden kombiniert Stream-Pipeline zu bilden.
Eine Stream-Pipeline besteht aus einer Quelle (z. B. einer Sammlung, einem Array, einer Generatorfunktion oder einem E/A-Kanal). gefolgt von null oder mehr Zwischenoperationen wie Stream.filter oder Stream.map; und eine Terminaloperation wie Stream.forEach oder Stream.reduce.
How does streams in Java affect memory consumption?
wurde Überall dort, wo zusätzliche Speicher zitiert nicht war:
Zwischenoperationen geben einen neuen Stream
Neben Dokumentation habe ich über verbundene SE Frage gegangen verbraucht aufgrund der Rohrauskleidung von Stream-Operationen. Der ursprüngliche Stream wird durch eine Pipeline geleitet.
Ein funktionierendes Beispiel aus Benjamin Blog:
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);
Aber als Zwischenoperationen wie filter, map and sorted
neuen Strom zurückkehrt, wie kommt es nicht den Speicherverbrauch nicht erhöht? Fehle ich hier etwas?
Die Objekte erstellt haben ein kurzes Leben, der Müllsammler ist sehr gut zu fegen sie. – Tunaki
Um alle Elemente zu sortieren, müssen sie gespeichert werden, da Sie nicht wissen, dass Sie das kleinste Element haben, bis Sie alle gesehen haben. –