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émentOptional
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 uneOptional
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