Я просто скажу, що остерігайтеся findFirst()
І findAny()
під час використання.
Починаючи з їх Javadoc ( тут і тут ), обидва методи повертають довільний елемент з потоку - якщо потік не має порядку зустрічі , в цьому випадку findFirst()
повертає перший елемент, а findAny()
поверне будь-який елемент.
Припустимо, у нас є спеціальний номер list
ISBN та назва КНИГИ. Для сценарію подивіться на цей приклад:
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());
}
Вихід :Optional[Java in Action]
Можуть існувати сценарії, коли назва книги однакова, але номери ISBN різні, у такому випадку сортування та пошук книги може бути дуже схожим findAny()
і даватиме неправильний результат. Подумайте про сценарій, коли 5 книг називаються "Довідник Java", але мають різні номери ISBN, і findFirst()
книга за назвою призведе до того, що findAny()
.
Подумайте про сценарій, коли:
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 |
+-----+------------------+
тут findFirst () і findAny () дадуть однаковий результат, навіть якщо сортувати за BookByName.
Детальна стаття:
filter
як застосовано,findAny
може повернути будь-який елемент, включаючи той, що не відповідає застосованому фільтру?