Parece que IntStream.iterate
es solo una versión ordenada ligera para IntStream.generate
. ¿Es verdad? Si no, ¿cuál es la diferencia central?
fuente
Parece que IntStream.iterate
es solo una versión ordenada ligera para IntStream.generate
. ¿Es verdad? Si no, ¿cuál es la diferencia central?
Observe cómo sus firmas son diferentes:
generate
toma 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.
iterate
toma ay seed
a 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 .
IntStream.iterate
Devuelve una ordenadaIntStream
por el contrarioIntStream.generate
devuelve un desordenadasIntStream
que puede ayudar en la aceleración de las tuberías de flujo paralelo.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.fuente
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, ...).
fuente