сколько раз карта будет вызываться в каждом случае?
Ответ зависит от работы терминала, а не от порядка 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-го элемента.
Что касается того, какой вариант предпочтительнее, я предполагаю, что у них будет одинаковое время выполнения, но это зависит от фактической реализации.