Java IntStream iterar vs generar cuándo utilizar qué?

19

Parece que IntStream.iteratees solo una versión ordenada ligera para IntStream.generate. ¿Es verdad? Si no, ¿cuál es la diferencia central?

JJ Beam
fuente

Respuestas:

21

Observe cómo sus firmas son diferentes:

  • generatetoma un IntSupplier, lo que significa que se supone que debes generar entradas sin que te den nada. Los usos de ejemplo incluyen la creación de una secuencia constante del mismo número entero, la creación de una secuencia de enteros aleatorios. Observe cómo cada elemento en la secuencia no depende del elemento anterior.

  • iteratetoma ay seeda IntUnaryOperator, lo que significa que se supone que debe generar cada elemento en función del elemento anterior . Esto es útil para crear una secuencia definida inductivamente, por ejemplo. En este caso, se supone que cada elemento depende del anterior .

Barrendero
fuente
Entonces, use el caso de iterar, cuando sea necesario guardar el estado, esta es la diferencia principal. Generar necesidad de almacenar estado en otro lugar. Y Iterate está ordenado, mientras que generate está desordenado, lo que es viable para el paralelismo
JJ Beam
8
  1. IntStream.iterateDevuelve una ordenadaIntStream por el contrario IntStream.generatedevuelve un desordenadasIntStream que puede ayudar en la aceleración de las tuberías de flujo paralelo.

  2. IntStream.generate son preferibles para generar valores aleatorios o constantes como se especifica en el Javadoc, supongo que lo más probable es que las características de la secuencia devueltas.

Naman
fuente
5

Aparte del orden, también el uso es un poco diferente. Veamos las firmas de métodos:

  • iterate(int seed, IntUnaryOperator f)
  • generate(IntSupplier s)

Iterate ha dado explícitamente el valor inicial como parámetro y operador unario que se utiliza para generar el siguiente valor del anterior. Aquí el operador puede ser fácilmente inmutable sin estado interno y puede reutilizarse en múltiples lugares en paralelo sin ningún problema.

Generar usos proveedor. Esos pueden proporcionar números constantes o aleatorios o deben tener un estado interno para proporcionar series como (1, 2, 3, ...).

n1t4chi
fuente