Как преобразовать List в Array в Java

Допустим, у нас есть список, и надо его преобразовать в массив. Как это сделать?
Возьмем для примера список строк:

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"));
    }

Код примеров доступен на GitHub (в тестах).

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

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