Powiem tylko, że uważaj na findFirst()i findAny()podczas używania.
Począwszy od ich Javadoc ( tutaj i tutaj ), obie metody zwracają dowolny element ze strumienia - chyba że strumień ma kolejność spotkań , w takim przypadku findFirst()zwraca pierwszy element while findAny()zwróci dowolny element.
Załóżmy, że mamy niestandardowy listnumer ISBN i nazwę BOOK. Aby zobaczyć scenariusz, spójrz na ten przykład:
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());
}
Wyjście :Optional[Java in Action]
Mogą istnieć scenariusze, w których nazwa książki jest taka sama, ale numery ISBN są różne, w takim przypadku sortowanie i znajdowanie książki może być bardzo podobne do findAny()i da błędny wynik. Pomyśl o scenariuszu, w którym 5 książek nosi nazwę „Referencje Java”, ale mają różne numery ISBN, a findFirst()książka według nazwy da taki sam wynik jak findAny().
Pomyśl o scenariuszu, w którym:
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 |
+-----+------------------+
tutaj findFirst () i findAny () dadzą ten sam wynik, nawet jeśli zostaną posortowane według BookByName.
Szczegółowy artykuł:
filterzastosowaniu a, czyfindAnymożesz zwrócić dowolny element, w tym ten, który nie pasuje do zastosowanego filtra?