Java IntStream iterar vs gerar quando usar o quê?


19

Parece que IntStream.iterateé apenas uma versão leve encomendada para IntStream.generate. É verdade? Caso contrário, qual é a principal diferença?

Respostas:


21

Observe como suas assinaturas são diferentes:

  • generateleva 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.

  • iterateleva a seede 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 .


Portanto, use o caso de iterar - quando for necessário salvar o estado - essa é a principal diferença. Gere a necessidade de armazenar o estado em outro lugar. E Iterate é ordenada, enquanto gerar é desordenado que é viável para parralelism
JJ feixe

8
  1. IntStream.iterateretorna uma ordem,IntStream por outro lado, IntStream.generateretorna uma ordem não ordenadaIntStream que pode ajudar a acelerar os pipelines de fluxo paralelo.

  2. 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.


5

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, ...).

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.