Инициализация ArrayList в одну строчку
Я хотел создать список опций для тестирования. Сначала я сделал это следующим образом:
ArrayList<String> places = new ArrayList<String>();
places.add("Buenos Aires");
places.add("Córdoba");
places.add("La Plata");
Затем я рефакторировал код следующим образом:
ArrayList<String> places = new ArrayList<String>(
Arrays.asList("Buenos Aires", "Córdoba", "La Plata"));
Есть ли более удобный способ сделать это?
5 ответ(ов)
Вам будет проще объявить это как List
. Действительно ли это должно быть именно ArrayList
?
List<String> places = Arrays.asList("Буэнос-Айрес", "Кордова", "Ла-Плата");
Если у вас только один элемент, вы можете сделать так:
List<String> places = Collections.singletonList("Буэнос-Айрес");
Это означает, что places
будет неизменяемым (попытка изменить его приведет к выбросу исключения UnsupportedOperationException
).
Если вы хотите создать изменяемый список на основе конкретного ArrayList
, то вы можете создать ArrayList
, используя неизменяемый список:
ArrayList<String> places = new ArrayList<>(Arrays.asList("Буэнос-Айрес", "Кордова", "Ла-Плата"));
Не забудьте импортировать нужный пакет:
import java.util.Arrays;
Если вам нужен простой список размером 1:
List<String> strings = new ArrayList<String>(Collections.singletonList("A"));
Если вам нужен список с несколькими объектами:
List<String> strings = new ArrayList<String>();
Collections.addAll(strings, "A", "B", "C", "D");
Оба варианта позволяют вам удобно создавать списки нужного размера и содержимого.
В Java 8 не были добавлены литералы коллекций, но вы можете использовать Stream API, чтобы инициализировать список одним достаточно длинным выражением:
List<String> places = Stream.of("Буэнос-Айрес", "Кордоба", "Ла Плата").collect(Collectors.toList());
Если вам нужно гарантировать, что ваш List
является экземпляром ArrayList
, вы можете сделать это следующим образом:
ArrayList<String> places = Stream.of("Буэнос-Айрес", "Кордоба", "Ла Плата").collect(Collectors.toCollection(ArrayList::new));
Такой подход позволяет элегантно создавать коллекции с помощью Stream API, избегая создания дополнительных переменных или промежуточных шагов.
В данном коде используется класс ImmutableList
из библиотеки Guava для создания неизменяемого списка строк.
Код создает список, который содержит названия городов Аргентины: "Буэнос-Айрес", "Кордова" и "Ла Плата". Благодаря тому, что этот список неизменяемый, вы не сможете добавлять, удалять или изменять элементы после его создания. Это может помочь избежать ошибок, связанных с изменением содержимого коллекции в процессе её использования.
Вот пример данного кода:
import com.google.common.collect.ImmutableList;
...
List<String> places = ImmutableList.of("Buenos Aires", "Córdoba", "La Plata");
Если нужен изменяемый список, вы можете использовать стандартный ArrayList
:
List<String> places = new ArrayList<>(Arrays.asList("Buenos Aires", "Córdoba", "La Plata"));
Таким образом, выбор между ImmutableList
и изменяемым списком зависит от вашего конкретного случая и требований к изменяемости данных.
Вы можете создать фабричный метод:
public static ArrayList<String> createArrayList(String ... elements) {
ArrayList<String> list = new ArrayList<String>();
for (String element : elements) {
list.add(element);
}
return list;
}
....
ArrayList<String> places = createArrayList(
"São Paulo", "Rio de Janeiro", "Brasília");
Но это не намного лучше вашего первоначального решения.
Для большей гибкости вы можете сделать метод универсальным:
public static <T> ArrayList<T> createArrayList(T ... elements) {
ArrayList<T> list = new ArrayList<T>();
for (T element : elements) {
list.add(element);
}
return list;
}
Этот подход позволит вам создавать списки для различных типов данных, что делает его более универсальным и гибким.
Преобразование 'ArrayList<String>' в 'String[]' в Java
Как инициализировать статическую Map?
Как напрямую инициализировать HashMap (в литеральном виде)?
Как инициализировать значения HashSet при создании?
Эффективный способ итерации по каждой записи в Java Map?