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.iteratedevuelve unIntStreamordenado, por otro lado,IntStream.generatedevuelve unIntStreamdesordenado que puede ayudar a acelerar las tuberías de flujo paralelo. -
Se prefiere
IntStream.generatepara 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:
-
generatetoma 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. -
iteratetoma unaseedy 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 .