Es scheint IntStream.iterate
nur eine leichte bestellte Version für zu sein IntStream.generate
. Ist es wahr? Wenn nicht, was ist der Hauptunterschied?
quelle
Es scheint IntStream.iterate
nur eine leichte bestellte Version für zu sein IntStream.generate
. Ist es wahr? Wenn nicht, was ist der Hauptunterschied?
Beachten Sie, wie sich ihre Signaturen unterscheiden:
generate
nimmt ein IntSupplier
, was bedeutet, dass Sie Ints generieren sollen, ohne etwas zu bekommen. Beispielverwendungen umfassen das Erstellen eines konstanten Stroms derselben Ganzzahl und das Erstellen eines Stroms zufälliger Ganzzahlen. Beachten Sie, dass jedes Element im Stream nicht vom vorherigen Element abhängt.
iterate
nimmt a seed
und a IntUnaryOperator
, was bedeutet, dass Sie jedes Element basierend auf dem vorherigen Element generieren sollen . Dies ist beispielsweise nützlich, um eine induktiv definierte Sequenz zu erstellen. In diesem Fall soll jedes Element vom vorherigen abhängen .
IntStream.iterate
Gibt eine bestellteIntStream
auf der anderen SeiteIntStream.generate
kehrt eine ungeordneteIntStream
, die bei der Beschleunigung parallel Stream - Pipelines helfen können.IntStream.generate
werden bevorzugt, um zufällige oder konstante Werte zu generieren, wie im Javadoc angegeben, ich würde höchstwahrscheinlich für die Eigenschaften des zurückgegebenen Streams raten.quelle
Abgesehen von der Bestellung ist auch die Verwendung etwas anders. Schauen wir uns die Methodensignaturen an:
iterate(int seed, IntUnaryOperator f)
generate(IntSupplier s)
Iterate hat explizit den Startwert als Parameter und unären Operator angegeben, der verwendet wird, um den nächsten Wert aus dem vorherigen zu generieren. Hier kann der Bediener ohne internen Status leicht unveränderlich sein und ohne Probleme an mehreren Stellen parallel wiederverwendet werden.
Generieren verwendet Lieferanten. Diese können entweder konstante oder zufällige Zahlen liefern oder müssen einen internen Zustand haben, um Reihen wie (1, 2, 3, ...) bereitzustellen.
quelle