Вступление
В этом руководстве мы конвертируем массив в более универсальный ArrayList в Java.
- Arrays.asList ()
- новый ArrayList <> (Arrays.asList ()) (Самый популярный и используемый подход)
- новый ArrayList <> (List.of ())
- Collections.addAll ()
- Collectors.toList ()
- Collectors.toCollection ()
- Lists.newArrayList ()
Массивы просты и обеспечивают базовую функциональность по группированию коллекции объектов или примитивных типов данных. Однако массивы также ограничены - их размер фиксирован, и даже основные операции, такие как добавление новых элементов в начале или перестановка элементов, могут быть сложными.
К счастью, Collections Framework познакомила нас со многими очень
полезными реализациями List , Set и Queue .
Одним из них является ArrayList , действительно универсальная и
популярная реализация List .
ArrayList примет любую Collection . Мы можем проявить творческий
подход к типу коллекции, которую передаем в нее.
Arrays.asList ()
Начнем с простейшей формы преобразования. У Arrays есть много полезных
методов. Метод asList() возвращает содержимое массива в List :
Employee emp1 = new Employee("John");
Employee emp2 = new Employee("Sarah");
Employee emp3 = new Employee("Lily");
Employee[] array = new Employee[]{emp1, emp2, emp3};
List<Employee> list = Arrays.asList(array);
System.out.println(list);
Это приведет к List реализации ( ArrayList ) , который будет населен
emp1 , emp2 и emp3 . Выполнение этого кода приводит к:
[Employee{name='John'}, Employee{name='Sarah'}, Employee{name='Lily'}]
новый ArrayList <> (Arrays.asList ())
Лучшим подходом, чем просто присвоение возвращаемого значения
вспомогательного метода, является передача возвращаемого значения в
new ArrayList<>() . Это стандартный подход, используемый
большинством людей.
Это потому, что метод asList() поддерживается исходным массивом.
Если вы измените исходный массив , список также изменится. Кроме того,
asList()возвращает фиксированный размер, поскольку он поддерживается фиксированным массивом. Операции, которые расширяют или сокращают список, возвращаютUnsupportedOperationException.
Чтобы избежать этого, мы применим функции ArrayList , передав
возвращаемое значение asList() конструктору:
Employee[] array = new Employee[]{emp1, emp2, emp3};
List<Employee> list = new ArrayList<>(Arrays.asList(array));
System.out.println(list);
Это приводит к:
[Employee{name='John'}, Employee{name='Sarah'}, Employee{name='Lily'}]
новый ArrayList <> (List.of ())
Начиная с Java 9, вы можете пропустить инициализацию самого массива и
передать его конструктору. Вы можете использовать List.of() и
передавать отдельные элементы:
List<Employee> list = new ArrayList<>(List.of(emp1, emp2, emp3));
System.out.println(list);
Это приводит к:
[Employee{name='John'}, Employee{name='Sarah'}, Employee{name='Lily'}]
Collections.addAll ()
Класс Collections предлагает множество полезных вспомогательных
методов, среди которых есть метод addAll() . Он принимает Collection
и набор elements и объединяет их.
Он очень универсален и может использоваться со многими ароматами
коллекции / vararg. Мы используем ArrayList и массив:
Employee[] array = new Employee[]{emp1, emp2, emp3};
List<Employee> list = new ArrayList<>();
Collections.addAll(list, array);
System.out.println(list);
Это приводит к:
[Employee{name='John'}, Employee{name='Sarah'}, Employee{name='Lily'}]
Collectors.toList ()
Если вы работаете с потоками, а не с обычными коллекциями, вы можете
собрать элементы потока и упаковать их в список с помощью toList() :
Employee[] array = new Employee[]{emp1, emp2, emp3};
List<Employee> list = Stream.of(array).collect(Collectors.toList());
System.out.println(list);
Выполнение этого даст:
[Employee{name='John'}, Employee{name='Sarah'}, Employee{name='Lily'}]
Collectors.toCollection ()
Точно так же вы можете использовать метод toCollection() для сбора
потоков в разные коллекции. В нашем случае мы предоставим в него
ссылку ArrayList::new , хотя вы также
можете указать другие ссылки:
Employee[] array = new Employee[]{emp1, emp2, emp3};
List<Employee> list = Stream.of(array)
.collect(Collectors.toCollection(ArrayList::new));
System.out.println(list);
Это также приводит к:
[Employee{name='John'}, Employee{name='Sarah'}, Employee{name='Lily'}]
Lists.newArrayList ()
Подобно вспомогательному классу и методу Arrays.asList() , проект
Google Guava познакомил нас с
вспомогательным классом Lists Вспомогательный класс Lists
newArrayList() :
Employee[] array = new Employee[]{emp1, emp2, emp3};
List<Employee> list = Lists.newArrayList(array);
Теперь ключевым выводом этого подхода было то, что вам не нужно
указывать тип при инициализации ArrayList . Это было действительно
полезно, когда у вас был список <Element <Element, Element>> .
Однако, поскольку Java 7 устранила необходимость явно указывать тип в операторе ромба, это стало устаревшим.
Заключение
Существует множество способов преобразовать массив в ArrayList в Java. Они охватывают от вызова вспомогательных методов до потоковой передачи массива и сбора элементов.