Réponses:
Notez en quoi leurs signatures sont différentes:
generate
prend 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.
iterate
prend a seed
et 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 .
IntStream.iterate
retourne un ordreIntStream
d'autre part IntStream.generate
renvoie un désordonnéesIntStream
qui peut aider à accélérer les pipelines de flux parallèles.
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é.
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, ...).