предельная (длинная) разность заказов в конвейере - PullRequest
0 голосов
/ 07 ноября 2018

В чем разница между

stream.map().limit(5).terminalOperation()

и эта строка

stream.limit(5).map().terminalOperation()

обе строки вернут один и тот же результат, но какая из них более оптимизирована и не будет занимать больше времени и ресурсов? и почему ? и сколько раз карта будет вызываться в каждом случае?

1 Ответ

0 голосов
/ 07 ноября 2018

сколько раз карта будет вызываться в каждом случае?

Ответ зависит от работы терминала, а не от порядка map и limit.

Операция терминала может потреблять только один элемент (findFirst()) или все элементы (collect()).

В любом случае, операция терминала диктует количество элементов, на которых выполняется map, которое должно быть одинаковым в обоих случаях.

Например, если вы собираете элементы в List, предполагая, что источник Stream имеет как минимум 5 элементов, map будет выполняться 5 раз для каждого конвейера.

Это можно проверить, добавив оператор println к шагу map:

List<String> list = Arrays.asList ("a","b","c","d","e","f");
list.stream().map(l->{System.out.println ("map1 " + l);return l +"44";}).limit(5).collect(Collectors.toList());
list.stream().limit(5).map(l->{System.out.println ("map2 " + l);return l +"44";}).collect(Collectors.toList());

Будет выведено:

map1 a
map1 b
map1 c
map1 d
map1 e
map2 a
map2 b
map2 c
map2 d
map2 e

В любом случае, map не выполняется для 6-го элемента.

Что касается того, какой вариант предпочтительнее, я предполагаю, что у них будет одинаковое время выполнения, но это зависит от фактической реализации.

...