Java IntStream iterieren vs generieren, wann was zu verwenden ist?

19

Es scheint IntStream.iteratenur eine leichte bestellte Version für zu sein IntStream.generate. Ist es wahr? Wenn nicht, was ist der Hauptunterschied?

JJ Beam
quelle

Antworten:

21

Beachten Sie, wie sich ihre Signaturen unterscheiden:

  • generatenimmt 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.

  • iteratenimmt a seedund 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 .

Kehrmaschine
quelle
Verwenden Sie also den Iterationsfall - wenn Sie den Status speichern müssen - dies ist der Hauptunterschied. Generieren Sie die Notwendigkeit, den Status an einem anderen Ort zu speichern. Und Iterieren ist geordnet, während Generieren ungeordnet ist, was für Parralelismus lebensfähig ist
JJ Beam
8
  1. IntStream.iterateGibt eine bestellteIntStream auf der anderen Seite IntStream.generatekehrt eine ungeordneteIntStream , die bei der Beschleunigung parallel Stream - Pipelines helfen können.

  2. 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.

Naman
quelle
5

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.

n1t4chi
quelle