Java IntStream itérer vs générer quand utiliser quoi?

19

Il semble que ce IntStream.iteratesoit juste une version légère commandée pour IntStream.generate. Est-ce vrai? Sinon, quelle est la principale différence?

JJ Beam
la source

Réponses:

21

Notez en quoi leurs signatures sont différentes:

  • generateprend un IntSupplier, ce qui signifie que vous êtes censé générer des ints sans rien recevoir. Les exemples d'utilisation incluent la création d'un flux constant du même entier, la création d'un flux d'entiers aléatoires. Remarquez que chaque élément du flux ne dépend pas de l'élément précédent.

  • iterateprend a seedet a IntUnaryOperator, ce qui signifie que vous êtes censé générer chaque élément en fonction de l'élément précédent . Ceci est utile pour créer une séquence définie par induction, par exemple. Dans ce cas, chaque élément est censé dépendre du précédent .

Balayeuse
la source
Donc, utilisez le cas d'itération - lorsque vous avez besoin de sauvegarder l'état - c'est la principale différence. Générer le besoin de stocker l'état ailleurs. Et Iterate est ordonné, tandis que generate n'est pas ordonné, ce qui est viable pour le parralélisme
JJ Beam
8
  1. IntStream.iterateretourne un ordreIntStream d'autre part IntStream.generaterenvoie un désordonnéesIntStream qui peut aider à accélérer les pipelines de flux parallèles.

  2. IntStream.generate sont préférés pour générer des valeurs aléatoires ou constantes comme spécifié dans le Javadoc, je suppose que c'est probablement pour les caractéristiques du flux renvoyé.

Naman
la source
5

Mis à part l'ordre, l'utilisation est également un peu différente. Regardons les signatures de méthode:

  • iterate(int seed, IntUnaryOperator f)
  • generate(IntSupplier s)

Iterate a explicitement donné la valeur de départ comme paramètre et opérateur unaire qui est utilisé pour générer la valeur suivante à partir de la précédente. Ici, l'opérateur peut facilement être immuable sans état interne et peut être réutilisé à plusieurs endroits en parallèle sans aucun problème.

Générer utilise le fournisseur. Ceux-ci peuvent fournir des nombres constants ou aléatoires ou avoir besoin d'un état interne pour fournir des séries comme (1, 2, 3, ...).

n1t4chi
la source