Respostas:
Observe como suas assinaturas são diferentes:
generate
leva a IntSupplier
, o que significa que você deve gerar ints sem receber nada. Exemplos de usos incluem a criação de um fluxo constante do mesmo número inteiro, criando um fluxo de números inteiros aleatórios. Observe como cada elemento no fluxo não depende do elemento anterior.
iterate
leva a seed
e a IntUnaryOperator
, o que significa que você deve gerar cada elemento com base no elemento anterior . Isso é útil para criar uma sequência definida indutivamente, por exemplo. Nesse caso, cada elemento deve depender do anterior .
IntStream.iterate
retorna uma ordem,IntStream
por outro lado, IntStream.generate
retorna uma ordem não ordenadaIntStream
que pode ajudar a acelerar os pipelines de fluxo paralelo.
IntStream.generate
são preferidos para gerar valores aleatórios ou constantes, conforme especificado no Javadoc, acho que provavelmente pelas características do fluxo retornado.
Além da ordem, também o uso é um pouco diferente. Vejamos as assinaturas do método:
iterate(int seed, IntUnaryOperator f)
generate(IntSupplier s)
A iteração forneceu explicitamente o valor inicial como parâmetro e operador unário, que é usado para gerar o próximo valor do anterior. Aqui, o operador pode ser facilmente imutável sem estado interno e pode ser reutilizado em vários locais em paralelo sem nenhum problema.
Gerar usa fornecedor. Esses podem fornecer números constantes ou aleatórios ou precisam ter um estado interno para fornecer séries como (1, 2, 3, ...).