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? Насправді, потоки були винайдені спеціально для того, щоб (а) дозволяти приємніший синтаксис і (б) не вводити зайві накладні витрати. (Насправді вони часто скорочують накладні витрати за допомогою лінивої оцінки.)
—
Кіліан Фот
Просто на основі синтаксису, схоже, спочатку ітерація фільтрується, а потім повторюється над відфільтрованими об'єктами вдруге, щоб запустити мій код.
—
Міррана
Навіть якби це було так, це все одно було б O (2 * N), що є O (N), тобто лінійним і не квадратичним. Але насправді ітерації переплетені між собою, і обидва можуть припинитися рано, якщо результат уже відомий - ось краса потоків. Однозначно варто витратити 15 хвилин на читання потоків на Java 8; як пише Венкат Субраманіам, "" Ламбда-вирази - це наркотик до Java 8, але "Потоки" - справжня залежність ".
—
Кіліан Фот
Крім того: ваш цикл - антипатерн;)
—
Thomas Junk
@ThomasJunk Чи можете ви пояснити, як це антипатерн? Я не знайомий з цим.
—
Міррана