Есть List list. Я хочу пробежаться по всем элементам и удвоить их.
list.spliterator().forEachRemaining(e -> e*2);
В итоге мой лист остается неизменным.
Я могу это сделать так:
List newList = new ArrayList<>();
for(int e in list) {
newList.add(e);
}
Но прошлый вариант короче. Я хочу это сделать с помощью лямбда-функции. Какие есть варианты?
Здесь можно и без spliterator'а. Способы делятся на три типа.
изменяется исходный список
.replaceAll() (спасибо @zRrr!)
List<Integer> list = Arrays.asList(1, 2, 3);
list.replaceAll(x -> x * 2);
(Ideone)
Похоже на исходный вариант (цикл с индексами + методы .get(), .set()):
for (int i = 0; i < list.size(); ++i) {
int x = list.get(i);
list.set(i, x * 2);
}
(Ideone)
создаётся новый список с нужными элементами
.stream() + .map() + .collect():
List<Integer> listTransformed = list
.stream()
.map(x -> x * 2)
.collect(Collectors.toList());
(Ideone)
Исходный вариант:
List<Integer> listTransformed = new ArrayList<>();
for (int x : list) {
newList.add(x * 2);
}
(Ideone)
создаётся view object над исходным списком
Используя метод Lists.transform() библиотеки Guava:
Lists.transform(list, x -> x * 2);
Варианты, когда в результате получается массив вместо списка:
.stream() + .mapToInt() + .toArray():
int[] array = list
.stream()
.mapToInt(x -> x * 2)
.toArray();
(Ideone)
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости