Cet article résume le comportement lors de l'incrémentation avec le troisième argument de la méthode iterate de la classe Stream ajoutée à partir de Java 9.
Je vois souvent le code suivant comme un moyen d'utiliser la méthode iterate, qui a trois arguments d'entrée pour la classe Stream.
Stream.Exemple de code pour savoir comment utiliser iterate
//Code qui génère une valeur numérique de 0 à 9
Stream.iterate(0, i -> i < 10, i -> i + 1).forEach(System.out::println);
Résultat d'exécution
0
1
2
3
4
5
6
7
8
9
Les arguments de la méthode iterate sont les suivants. ** Premier argument **: valeur initiale ** Second argument **: une classe qui renvoie une condition pour renvoyer le prochain élément Stream (décrit dans une expression lambda dans l'exemple de code) ** Troisième argument **: Classe qui renvoie l'élément du prochain Stream (décrit dans l'expression lambda dans l'exemple de code) La réécrire dans l'instruction for conventionnelle est la suivante.
Code qui réécrit l'exemple de code dans l'instruction for conventionnelle
for (int i = 0; i < 10; i++) {
System.out.println(i);
}
Lorsque j'en ai entendu parler pour la première fois, j'ai été impressionné par le fait que l'API Stream puisse être utilisée pour des choses semblables à des phrases.
La documentation de l'API Java est liée ci-dessous. [Spécifications Stream.iterate de la documentation de l'API Java](https://docs.oracle.com/javase/jp/9/docs/api/java/util/stream/Stream.html#iterate-T-java.util .function.Predicate-java.util.function.UnaryOperator-)
Je m'interrogeais sur le fait que le troisième argument est souvent expliqué par i-> i + 1 sans utiliser d'incrément, j'ai donc écrit ce qui suit.
Code qui réécrit le troisième argument de l'exemple de code?
Stream.iterate(0, i -> i < 10, i -> i++).forEach(System.out::println);
Ensuite, le résultat de l'exécution est le suivant.
Résultat d'exécution
0
0
0
0
0
0
0
0
~~~~~~~~~~~~~~~~~~~~~~
Ci-dessous, 0 est affiché à l'infini, il est donc omis.
~~~~~~~~~~~~~~~~~~~~~~
Le résultat sera affiché avec i = 0 et une boucle infinie se produira. Étant donné que la méthode apply de la classe UnaryOperator spécifiée dans le troisième argument de Stream.class (décrite dans l'expression lambda dans l'exemple de code) est utilisée, elle est renvoyée avant l'incrémentation de la valeur dans le troisième argument. Si vous voulez vraiment l'incrémenter, vous devez le réécrire du suffixe au préfixe comme indiqué ci-dessous.
Code qui réécrit le troisième argument de l'exemple de code
Stream.iterate(0, i -> i < 10, i -> ++i).forEach(System.out::println);
Puisqu'il existe une telle fonctionnalité sur l'incrément, elle peut être écrite en i-> i + 1 lors de son introduction. Lorsque vous écrivez personnellement, il semble utiliser l'incrément. En premier lieu, je n'utilise Java qu'après 9 pour moi-même ...
Recommended Posts