Согласно Java Doc AllMatch ():
Возвращает, все ли элементы этого потока соответствуют предоставленному предикату. Не может оценить предикат по всем элементам, если это не необходимо для определения результата. Если поток пуст, то возвращается {@code true}, а предикат не оценивается.
@apiNote
Этот метод оценивает универсальное количественное определение предиката по элементам потока (для всех x P (x)). Если поток пустой, то считается, что количественное определение выполнено в вакууме и всегда {@code true} (независимо от P (x)).
предикат для применения к элементам этого потока @return {@code true}, если либо все элементы потока соответствуют предоставленному предикату, либо поток пуст, в противном случае {@code false}
В твоем случае:
1-
p(x) : s -> s.startsWith("F")
X : "Fred"
result : X P(X) = true
2-
p(x) : s -> s.startsWith("F")
X : "Jim"
result : X P(X) = false
Дальнейшая оценка не будет выполнена, потому что XP (X) = false
boolean result = Arrays.asList("Fred", "Finda", "Fish")
.stream()
.peek(System.out::println)
.allMatch(s -> s.startsWith("F"));
System.out.println("Result "+result);
Выход:
Fred
Finda
Fish
Result true
Здесь поток обрабатывается полностью, потому что xP (x) = true от каждого элемента