java java-8 java-stream

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?


  1. IntStream.iterate devuelve un IntStream ordenado, por otro lado, IntStream.generate devuelve un IntStream desordenado que puede ayudar a acelerar las tuberías de flujo paralelo.

  2. 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 un IntSupplier , 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 una seed y un 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 .