В этой статье рассмотрим, как преобразовать List в массив и наоборот: как преобразовать массив в List.
Преобразование List в Array
Допустим, у нас есть список, и надо его преобразовать в массив. Как это сделать? Возьмем для примера список строк:
List<String> list = new ArrayList<>(); list.add("Petya"); list.add("Vasya");
Мы хотим преобразовать его в массив:
String[] stringArray =
Сделаем это без сторонних библиотек средствами JDK. Начнем с 11 версии, дальше покажу способы на 8 версии, и потом метод с Generics.
Способ № 1 (JDK 11)
Итак, с 11 версии список в массив можно преобразовать вот так изящно:
String[] stringArray = list.toArray(String[]::new);
Способ № 2 (JDK 8)
В 8 версии можно сделать так (внимание, в скобках параметром указываем тип массива, а иначе результирующий массив будет типа Object[]):
String[] stringArray = list.toArray(new String[0]);
Заметьте, что в аргументе можно указать массив нулевой длины, главное, что есть тип. В этом случае будет создан и вернется новый массив нужной длины. Если же список помещается, то вернется тот, что в аргументе.
Способ № 3 с использованием stream() (JDK 8)
String[] stringArray = list.stream().toArray(String[]::new);
Метод для Generics
Допустим, надо написать общий метод для любого типа данных:
private static <T> String[] listToArray(List<T> list) { String [] array = new String[list.size()]; for (int i = 0; i < array.length; i++) array[i] = list.get(i).toString(); return array; }
Проверим, что он работает. Создадим класс:
class Person{ private String name; public Person(String name) { this.name = name; } public String toString() { return name; } }
Протестируем метод:
@Test public void m4() { List<Person> list=new ArrayList<>(); list.add(new Person("Petya")); list.add(new Person("Vasya")); String[] stringArray = listToArray(list); assertThat(stringArray[0], is("Petya")); assertThat(stringArray[1], is("Vasya")); }
Преобразование Array в List
Теперь допустим у нас есть массив строк:
String[] stringArray = new String[]{"Petya", "Vasya"};
Массив в List преобразуется так:
List<String> list = Arrays.asList(stringArray);
Но полученный массив — фиксированного размера, в него нельзя добавлять и удалять элементы. Менять же элементы внутри можно, при этом изменения отразятся на массиве. И наоборот.
Чтобы получить обычный List, можно создать новый List на основе предыдущего:
new ArrayList<String>(list);
Также метод не годится для преобразования массива примитивов в список, т.к. возьмет переданный массив в качестве первого объекта.
Преобразование массива примитивов в список List
Для примитивов проще использовать метод стримов boxed():
int[] ar={1,2,3,4,5}; List<Integer> list= Arrays.stream(ar).boxed().toList();
Преобразование List<Integer> в массив примитивов
List<Integer> list = .. int[] arrayOfPrimitives = list.stream().mapToInt(i -> i).toArray();
Исходный код
Код примеров доступен на GitHub (в тестах).