Stream API: ускоряемся🚀



Stream API помогает писать выразительный код, который быстро работает. Несложными действиями можно повысить скорость ещё больше:



1️⃣ Добавить parallel().

Для поддержки параллельности нужны дополнительные ресурсы, и прирост скорости заметен только если в коллекции много элементов. Если:

N – количество элементов,

Q – количество операций над каждым элементом,

то при N*Q>10000 можно смело добавлять parallel()



2️⃣ Добавить или удалить sorted(), unordered().

🔸sorted()
: отсортировать стрим и добавить свойство «отсортирован».

🔸unordered(): выставить свойство «порядок не важен».

Источник данных и методы sorted, unordered, dictinct,... определяют свойства стрима: конечный размер, уникальность, отсортированные значения и другие. Благодаря этому некоторые методы оптимизируют работу. Если порядок не важен, параллельная обработка будет быстрее. Если список уже отсортирован, удаление повторяющихся элементов distinct() займёт меньше времени. Иногда наоборот — дополнительные ограничения замедляют работу.

Другие специфичные примеры.



3️⃣ Пользоваться специальными методами.

Чем меньше операций, тем быстрее всё работает. Проверить, что ни один элемент не удовлетворяет условию можно так:

filter(...).findFirst().isPresent()

а можно короче, понятнее и быстрее:

noneMatch(...)



Иногда стримы даже не нужны, много полезных методов есть в интерфейсе Collections. Например, максимальный элемент в списке быстрее найти через Collections.max(...), чем с использованием стрима.

Больше примеров



4️⃣ Объединить однотипные операции.

Чаще это касается сложной фильтрации:

filter(1).filter(2).filter(3)

можно ускорить в 2-4 раза, если объединить условия:

filter(1 & 2 & 3)