Скажу лишь, что остерегайтесь 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
может вернуть любой элемент, в том числе , что не соответствует фильтр применяется?