Потоки ленивы
Это означает, что результаты не извлекаются до тех пор, пока не будет вызвана операция терминала .
Однако count()
является операцией терминала, поэтому конвейер выполняется .
Потоки также имеют короткое замыкание
Это означает, что если пройдено достаточное количество элементов для успешного выполнения операции, больше элементов не будет пройдено. Так обстоит дело, например, с findFirst()
.
Однако операция count()
предлагает подсчитать все элементы, что требует прохождения всех элементов для получения результата. .
Теперь хорошая новость заключается в том, что некоторую информацию можно напрямую запрашивать из источника потока. Одним из таких примеров является количество элементов, когда в потоке установлен флаг SIZED
. Поток тогда достаточно умен, чтобы напрямую получать информацию из источника потока, вместо того, чтобы обойти все элементы. Эта оптимизация была ошибочно не реализована в Java 8, а реализована в Java 9 .
Поставщик потока
Характеристики задаются поставщиком поток. И будет ли count()
коротким замыканием, в конце концов, решать поставщику потоков.