Java IntStream iterar vs generar cuándo utilizar qué?
java-8 java-stream (3)
Parece que
IntStream.iterate
es solo una versión ligera y ordenada para
IntStream.generate
.
¿Es verdad?
Si no, ¿cuál es la diferencia central?
-
IntStream.iterate
devuelve unIntStream
ordenado, por otro lado,IntStream.generate
devuelve unIntStream
desordenado que puede ayudar a acelerar las tuberías de flujo paralelo. -
Se prefiere
IntStream.generate
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.
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, ...).
Observe cómo sus firmas son diferentes:
-
generate
toma unIntSupplier
, lo que significa que se supone que debes generar entradas sin recibir 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. -
iterate
toma unaseed
y unIntUnaryOperator
, 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 .