Risposte:
Nota come le loro firme sono diverse:
generate
prende a IntSupplier
, il che significa che dovresti generare ints senza che ti venga dato nulla. Esempi di utilizzo includono la creazione di un flusso costante dello stesso numero intero, la creazione di un flusso di numeri interi casuali. Notare come ogni elemento nel flusso non dipende dall'elemento precedente.
iterate
prende a seed
e a IntUnaryOperator
, il che significa che dovresti generare ogni elemento in base all'elemento precedente . Questo è utile per creare una sequenza definita induttivamente, per esempio. In questo caso, ogni elemento dovrebbe dipendere da quello precedente .
IntStream.iterate
restituisce un ordineIntStream
invece IntStream.generate
restituisce un non ordinatoIntStream
che può aiutare ad accelerare le condotte di flusso parallelo.
IntStream.generate
sono preferiti per generare valori casuali o costanti come specificato in Javadoc, immagino molto probabilmente per le caratteristiche del flusso restituito.
A parte l'ordine, anche l'uso è un po 'diverso. Diamo un'occhiata alle firme del metodo:
iterate(int seed, IntUnaryOperator f)
generate(IntSupplier s)
Iterate ha esplicitamente dato il valore iniziale come parametro e operatore unario che viene utilizzato per generare il valore successivo dal precedente. Qui l'operatore può essere facilmente immutabile senza stato interno e può essere riutilizzato in più punti in parallelo senza alcun problema.
Generare utilizza fornitore. Questi possono fornire numeri costanti o casuali o devono avere uno stato interno per fornire serie come (1, 2, 3, ...).