Ответ 1
Вы можете просто удалить свой строитель и встроить его, чтобы получить (более длинный) однострочный
ImmutableList<String> output =
ImmutableList.copyOf(Iterables.transform(input, function));
Это своего рода оптимальное значение, поскольку результат Iterables.transform
ленив, поэтому временный список не выделяется. Есть AFAIK некоторые незначительные неэффективности:
- Выделение
FluentIterable
- Изменение размера массива, используемого для результата
Если вам действительно очень нужна скорость, вы можете сравнить ее и сравнить с чем-то вроде
ArrayList<String> tmp = Lists.newArrayListWithCapacity(input.size());
Iterables.addAll(tmp, Iterables.transform(input, function));
ImmutableList<String> output = ImmutableList.copyOf(tmp);
и в петлю с ручкой.
UPDATE
В то время как первый подход, безусловно, является наиболее читаемым, он берет на себя некоторые распределения для изменения размера массива, а также окончательное сокращение до нужного размера. Со списком длины 1234567 существуют следующие шаги изменения размера:
4 → 7 → 11 → 17 → 26 → 40 → 61 → 92 → 139 → 209 → 314 → 472 → 709 → 1064 → 1597 → 2396 → 3595 → 5393 → 8090 → 12136 → 18205 → 27308 → 40963 → 61445 → 92168 → 138253 → 207380 → 311071 → 466607 → 699911 → 1049867 → 1574801
и окончательное сокращение
1574801 → 1234567
ОБНОВЛЕНИЕ 2
Как сказал Луис и Крис, оптимальным решением является
ImmutableList<String> output =
ImmutableList.copyOf(Lists.transform(input, function));
поскольку он не включает копирование массива. Это работает в результате Lists.transform
- это ленивая коллекция, а ImmutableList.copyOf
запрашивает свой размер, чтобы выделить массив с соответствующим размером. Обратите внимание, что ни Iterables.transform
, ни FluentIterable
не эффективны.