Я знаю, что промежуточные потоковые операции в Java ленивы и не выполняются до тех пор, пока не будет вызвана терминальная операция. Однако я не уверен, увеличивает ли цепочка промежуточных операций количество требуемых итераций. Потому что иногда мы разделяем операции на несколько промежуточных, просто чтобы их было легче читать.
Например, следующие два примера делают одно и то же. Но во втором примере две промежуточные операции объединяются в одну.
myStream
.map(s -> methodA(s))
.map(s -> methodB(s))
.collect(Collectors.joining());
myStream
.map(s -> methodB(methodA(s)))
.collect(Collectors.joining());
Разве количество итераций не одинаково в обоих случаях? Поскольку кажется, что JVM может выполнить его за одну итерацию (аналогично одному циклу for), а не перебирать элементы для каждой промежуточной операции.
Вы имеете в виду сложность времени... не производительность или время выполнения? Очевидно, что временная сложность здесь будет такой же.
Да, временная сложность. Как 2н, 3н. Не время выполнения.
Время complexity не меняется, может быть, один раз вы запускаете N операций, другой раз N+N=2*N операций, но они по-прежнему O(N). Если вы разделите его на 100 операций, вы выполните 100 * N операций, что по-прежнему равно O (N).
Говоря о сложности,
O(2n)
,O(3n)
и т. д. не имеют значения. Они оба простоO(n)
. Он представляет собой рост, а не фактическое время выполнения.@jrook Мой немного конкретнее. Я хочу знать, есть ли разница в количестве требуемых итераций.
Количество итераций (время) сильно отличается от порядка, о чем вы говорите
O(n)
(рост) @GayanWeerakutti. Какой из них вы пытаетесь узнать?Вы измеряли, сколько времени занимает каждый? Отвечает ли это на ваш вопрос? Как написать правильный микротест на Java?
@GayanWeerakutti Вот еще один ответ, говорит то же самое. Между оптимизацией горячих точек и другими окружающими условиями практически невозможно узнать теоретические аргументы.
Независимо от того, ленивы промежуточные операции или нет, временная сложность не меняется. Так что не путайте временную сложность с производительностью. Они могут взаимодействовать, но все же это совершенно разные вещи.
@Holger Я обновил вопрос. Меня больше интересует количество итераций.
Отвечая на ваш обновленный вопрос, оба варианта эквивалентны одному циклу.
@jrook Спасибо. Это должно ответить на мой вопрос.
@Holger Приятно знать. Ваш другой ответ - при использовании операций фильтра. Если у вас есть другой ответ на этот вопрос, с упором на количество итераций и тому подобное, я был бы рад снова открыть этот вопрос.
@GayanWeerakuttiI полагаю, что будет лучше задать новый вопрос только с той частью, на которую нет ответа в оригинале, на который есть ссылка. В свой новый вопрос включите ссылку на этот вопрос и/или на этот, чтобы прояснить разницу.
@ОлеВ.В. Думаю, вопрос уже совсем в другом. Я несколько раз перефразировал. Но я не уверен, будет ли ответ таким же или нет. Могу ли я снова открыть его?
В основном, я спрашиваю о количестве итераций. Как упомянул @Holger, это одинаково для обоих вариантов.