Как в Java преобразовать List в массив, и наоборот

В этой статье рассмотрим, как преобразовать 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 (в тестах).

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *