Немного прочитав на Java 8, я получил сообщение этого в блоге, объясняющее немного о потоках и их сокращении, а также, схема сокращения. Внизу указано:
Обратите внимание, что в случае
findFirst
илиfindAny
нам нужно только первое значение, которое соответствует предикату (хотяfindAny
не гарантирует возврата первого). Однако, если поток не имеет порядка, то ожидать, чтоfindFirst
будет вести себя какfindAny
. ОперацииallMatch
,noneMatch
иanyMatch
могут вообще не замыкать поток, поскольку он может оценивать все значения, чтобы определить, является ли операторtrue
илиfalse
. Таким образом, бесконечный поток с их использованием может не завершиться.
Я понимаю, что findFirst
или findAny
может сократить замыкание, потому что, как только вы найдете элемент, вам больше не нужно обрабатывать.
Но почему это невозможно для allMatch
, noneMatch
и anyMatch
? Для allMatch
, если вы найдете тот, который не соответствует предикату, вы можете прекратить обработку. То же самое ни для кого. И anyMatch
в особенности не имеет для меня смысла, поскольку он в значительной степени равен findAny
(за исключением того, что возвращается)?
Говоря о том, что эти три не могут быть короткозамкнутыми, потому что они могут оценивать все значения, также можно было бы сказать для findFirst/Any
.
Есть ли какая-то принципиальная разница, которую я не вижу? Я действительно не понимаю, что происходит?