Considérez ce code:
public static void main(String[] args) {
Stream.iterate(1, i -> i + 1)
.flatMap(i -> Stream.of(i, i, i))
.peek(System.out::println)
.limit(4)
.forEach(i -> {});
}
La sortie en Java 8:
1
1
1
2
2
2
Et en Java 11:
1
1
1
2
Était-ce un bogue ou un comportement prévu dans Java 8 qui a été modifié en 11?
Le code ci-dessus n'est qu'un exemple pour illustrer les différents comportements, mais une implication plus sérieuse de la différence est que le code suivant imprime 1,2,3 en Java 11 mais entre dans une boucle infinie dans Java 8:
Stream.iterate(0, i -> i + 10)
.flatMap(i -> Stream.iterate(i + 1, j -> j + 1))
.limit(3)
.forEach(System.out::println);
la paresse a changé en cas de flatMap
, jusqu'à ce que Java-10, flatMap
ne soit jamais paresseux. voir JDK-8075939
Stream.flatMap( )
provoque la rupture du court-circuit des opérations du terminal -
c'est un bug qui a été corrigé à partir de Java 10 .
Ce n'est pas un bug mais une optimisation pour faire fonctionner flatMap
en mode paresseux.
L'une des belles améliorations de fonctionnalités que je peux voir, car maintenant je peux utiliser flatMap
de manière paresseuse, avec prenant presque entièrement en charge composition fonctionnelle plutôt que juste une chaîne d'exécution de fonctions (sinon paresseux).
La composition fonctionnelle m'excite vraiment chaque jour quand je commence à écrire [~ # ~] nouveau [~ # ~] = Java code.
Peut-être que je suis en retard à la fête .. !! : P