Ich habe Java 8 in Action gelesen, daher weiß ich, was Stream ist und wie man es benutzt. Aus Sicht der Informatik müssen jedoch alle Daten in einer Art Datenstruktur gespeichert werden. Also,
Wie speichere ich Stream?
Wie kann Stream so viele Operationen für so viele Arten von Sammlungen durchführen (z. B. Array, verkettete Liste, Karte)?
Oder ist Stream nur eine Schnittstelle und alle Arten von Sammlungen sind erforderlich, um diese in dieser Schnittstelle spezifizierten Operationen zu implementieren?
Danke!
Ein wichtiger Unterschied zu einem Stream besteht im Vergleich zu einer Collection darin, dass ein Stream faul bewertet werden soll. Nimm den Auszug aus dem JavaDoc
Ströme sind faul; Die Berechnung der Quelldaten wird nur durchgeführt, wenn die Terminaloperation gestartet wird, und die Quellelemente werden nur bei Bedarf verbraucht.
Eine Instanz eines Streams garantiert nicht, dass alle Elemente dieses Streams bekannt sind. Die Elemente des Streams werden nur berechnet, wenn sie benötigt werden. Dies spiegelt Funktionen wider, die in anderen funktionalen Sprachen wie Haskell oder Scala enthalten sind. Sie würden einen Stream verwenden, um unendliche Listen zu modellieren. Zum Beispiel ein Stream, der eine Fibonacci-Sequenz berechnen kann. Es würde immer nur die Elemente berechnen, die angefordert wurden. Es würde nicht alle Elemente berechnen, da es niemals vervollständigt werden würde.
Die Annahme, dass Sie den Inhalt eines Streams immer speichern können, ist nicht korrekt. Sie würden den Inhalt eines Streams nur speichern, wenn es sich um eine endliche Liste handelt, deren Werte alle identifiziert wurden. An diesem Punkt gibt es wenig Grund, einen Stream über einer traditionellen Sammlung zu verwenden.
Sie können sich die Quelle für Collection.stream()
ansehen und sehen, wie sie behandelt wird. Es gibt keine Magie, es ist nur normaler Java-Code mit Stream
-Objekten und Spliterators
und anderen verwandten Klassen.
Stream
muss auch keine Objekte speichern, da sie bereits in der Collection
gespeichert sind, aus der die Stream
erstellt wurde. Ein nichtparalleler Stream ist eigentlich ziemlich einfach.
Oder ist Stream nur eine Schnittstelle und alle Arten von Sammlungen sind erforderlich, um diese in dieser Schnittstelle spezifizierten Operationen zu implementieren?
Das ist es. Um korrekt zu sein: Eine Sammlung muss eine Methode stream
implementieren, die wie beschrieben implementiert werden muss.
Die Schnittstelle Stream
bietet jedoch einige Standardmethoden. Einige Stream-Provider führen ihren eigenen Speicher, z.B. Sammlungen. Andere brauchen keine Speicherung, z.B. natürliche Zahlenanbieter, Zufallszahlenanbieter.
Tags und Links java java-8 java-stream