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 list
numer 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ł:
filter
zastosowaniu a, czyfindAny
możesz zwrócić dowolny element, w tym ten, który nie pasuje do zastosowanego filtra?