Чи неефективний Collection.stream (). Filter (). ForEach () порівняно зі стандартом для кожного циклу?


15

IntelliJ IDEA рекомендував мені щойно замінити наступний цикл для кожного циклу на виклик Java 8 "forEach":

    for (Object o : objects) {
        if (o instanceof SomeObject) {
            doSomething();
        }
    }

Рекомендований дзвінок хотів би так:

objects.stream().filter(o -> o instanceof SomeObject).forEach(o -> doSomething());

Якщо я не розумію, як працює основна функціональність Stream, мені здається, що використання потоку - це операція O (2n) на відміну від операції O (n) для стандартної для кожного циклу.


8
Чому ти вважаєш, що це O ^ 2? Насправді, потоки були винайдені спеціально для того, щоб (а) дозволяти приємніший синтаксис і (б) не вводити зайві накладні витрати. (Насправді вони часто скорочують накладні витрати за допомогою лінивої оцінки.)
Кіліан Фот

Просто на основі синтаксису, схоже, спочатку ітерація фільтрується, а потім повторюється над відфільтрованими об'єктами вдруге, щоб запустити мій код.
Міррана

6
Навіть якби це було так, це все одно було б O (2 * N), що є O (N), тобто лінійним і не квадратичним. Але насправді ітерації переплетені між собою, і обидва можуть припинитися рано, якщо результат уже відомий - ось краса потоків. Однозначно варто витратити 15 хвилин на читання потоків на Java 8; як пише Венкат Субраманіам, "" Ламбда-вирази - це наркотик до Java 8, але "Потоки" - справжня залежність ".
Кіліан Фот

1
Крім того: ваш цикл - антипатерн;)
Thomas Junk

1
@ThomasJunk Чи можете ви пояснити, як це антипатерн? Я не знайомий з цим.
Міррана

Відповіді:


21

Потоки Java не повторюються один раз у вашій колекції для кожного оператора, незважаючи на те, що означає синтаксис. Він застосовує весь ланцюжок до кожного елемента, по одному елементу.

У вашому випадку потік діяв би точно так само, як і цикл. Візьміть елемент, порівняйте його з присудком, а потім застосуйте свою операцію, а потім перейдіть до наступного елемента.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.