Потоковые методы делают al oop внутренне? - PullRequest
2 голосов
/ 18 апреля 2020

Я изучаю API потоков для Java, и из того, что я вижу, настоятельно рекомендую использовать несколько методов для изменения коллекции с помощью потока, кроме того, очень хорошо, что с этим API-интерфейсом я прекращаю использовать циклы, но Мне было интересно, каждый метод потока не выполняет необходимые циклы интернирования? Разве это не приводит к снижению производительности (приложений, требующих хорошей производительности), которые я использую Stream? Во многих случаях я мог сделать более одной необходимой модификации коллекции всего за одну l oop.

Но я также представляю, что разработчики JDK и JVM также выполнили свою черную магию c, чтобы предотвратить это. , Если да, каковы детали этого волхва c?

1 Ответ

4 голосов
/ 18 апреля 2020

Каждый метод в потоковом API не создает новый l oop ... он объединяет методы и выполняет их в одном l oop, как только достигает метода завершения (например, collect). Из документации :

Потоковые операции делятся на промежуточные и терминальные операции и объединяются в потоковые конвейеры. Потоковый конвейер состоит из источника (например, коллекции, массива, функции генератора или канала ввода-вывода); за ним следует ноль или более промежуточных операций, таких как Stream.filter или Stream.map; и терминальная операция, такая как Stream.forEach или Stream.reduce.

Обработка потоков данных лениво обеспечивает значительную эффективность; в конвейере, таком как приведенный выше пример filter-map-sum, фильтрация, отображение и суммирование могут быть объединены в один проход данных с минимальным промежуточным состоянием. Лень также позволяет избежать проверки всех данных, когда в этом нет необходимости; для таких операций, как «найти первую строку длиной более 1000 символов», необходимо только изучить достаточно строк, чтобы найти ту, которая обладает желаемыми характеристиками, без проверки всех строк, доступных из источника. (Это поведение становится еще более важным, когда входной поток бесконечен, а не просто велик.)

Единственный метод, который создает новый l oop, это flatMap.

Other чем это, да потоки медленнее, но не намного. Они намного легче читать, писать, изменять, хотя. И в дополнение к этому, они поощряют неизменность, которая является компромиссом производительности для менее ошибочного кода.

...