web-dev-qa-db-fra.com

Différence de flux entre Java 8 et 11

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);
16
DodgyCodeException

la paresse a changé en cas de flatMap, jusqu'à ce que Java-10, flatMap ne soit jamais paresseux. voir JDK-8075939

6
Eugene

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 .

9
Oleksandr Pyrohov

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

1
miiiii