Je dirai simplement que méfiez-vous de findFirst()
Et findAny()
lors de l'utilisation.
À partir de leur Javadoc ( ici et ici ), les deux méthodes renvoient un élément arbitraire du flux - à moins que le flux n'ait un ordre de rencontre , auquel cas findFirst()
renvoie le premier élément tandis que findAny()
retournera n'importe quel élément.
Supposons que nous ayons un list
ISBN et un nom de LIVRE personnalisés. Pour un scénario, regardez cet exemple:
public class Solution {
private Integer ISBN;
private String BookName;
public Solution(int i, String string) {
ISBN =i;
BookName = string;
}
}
public static void main(String[] args) {
List<Solution> Library = Arrays.asList(new Solution(12,"Java in Action"),new Solution(13,"Java 8"),new Solution(15,"Java 8 Features"),new Solution(16,"Java in Action"));
System.out.println(Library.stream()
.map(p->p.getBookName())
.sorted(Comparator.reverseOrder())
.findFirst());
}
Sortie :Optional[Java in Action]
Il peut y avoir des scénarios où le nom du livre est le même mais les numéros ISBN sont différents, dans ce cas le tri et la recherche du livre peuvent être très similaires findAny()
et donneront un résultat erroné. Pensez à un scénario où 5 livres sont nommés «Java Reference» mais ont des numéros ISBN différents et un findFirst()
livre par nom donnera le même résultat que findAny()
.
Pensez à un scénario où:
ISBN Name Of book
+-----+------------------+
| 100 | Java-8 in Action |
+-----+------------------+
| 101 | Java-8 in Action |
+-----+------------------+
| 102 | Java-8 in Action |
+-----+------------------+
| 103 | Java-8 in Action |
+-----+------------------+
| 104 | Java-8 in Action |
+-----+------------------+
ici findFirst () et findAny () donneront le même résultat même si triés sur BookByName.
Article détaillé:
filter
application d'un,findAny
peut renvoyer n'importe quel élément, y compris celui qui ne correspond pas au filtre appliqué?