Вступление
В этом руководстве мы конвертируем массив в более универсальный 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. Они охватывают от вызова вспомогательных методов до потоковой передачи массива и сбора элементов.