Différence entre findAny () et findFirst () dans Java 8

Je suis un peu confus entre Stream#findAny() et Stream#findFirst() de l’API Stream de Java 8.

Ce que j’ai compris, c’est que les deux renvoient le premier élément correspondant du stream, par exemple, lorsqu’il est utilisé avec le filtre?

Alors, pourquoi deux méthodes pour la même tâche? Est-ce que je manque quelque chose?

Ce que j’ai compris, c’est que les deux renvoient le premier élément correspondant du stream, par exemple, lorsqu’il est utilisé avec le filtre?

Ce n’est pas vrai. Selon le javadoc, Stream#findAny() :

Renvoie un élément Optional décrivant un élément du stream, ou un élément Optional vide si le stream est vide. Le comportement de cette opération est explicitement non déterministe; il est libre de sélectionner n’importe quel élément du stream. Cela permet une performance maximale dans les opérations parallèles;

tandis que Stream.findFirst() renverra un Optional décrivant ssortingctement le premier élément du stream. La classe Stream n’a pas de méthode .findOne() , alors je suppose que vous .findFirst() dire .findFirst() .

Non, les deux ne renverront pas le premier élément du Stream.

De Stream.findAny() (emphase le mien):

Renvoie une Optional décrivant un élément du stream ou une Optional si le stream est vide.

Ceci est une opération de terminal en court-circuit.

Le comportement de cette opération est explicitement non déterministe; il est libre de sélectionner n’importe quel élément du stream . Cela permet une performance maximale dans les opérations parallèles; le coût est que plusieurs appels sur la même source peuvent ne pas renvoyer le même résultat. (Si un résultat stable est souhaité, utilisez findFirst() .

Pour le dire plus simplement, il peut ou non choisir le premier élément du stream.

Avec l’implémentation spécifique actuelle d’Oracle, je pense qu’elle renverra le premier élément dans un pipeline non parallèle. Cependant, dans un pipeline parallèle, il ne sera pas toujours exécuté (par exemple, System.out.println(IntStream.range(0, 100).parallel().findAny()); il a renvoyé OptionalInt[50] lors de mon System.out.println(IntStream.range(0, 100).parallel().findAny()); il). De toute façon, vous ne devez pas compter sur cela.

En mode parallèle, le findAny ne garantit pas l’ordre, mais findFirst fait.

J’ai écrit un extrait de code pour montrer la différence, visitez-le