Перейти к контенту

Примеры преобразования списка в массив на Java

Хотя список является более мощным, чем массив в Java, в некоторых случаях мы хотим преобразовать первое в структуру данных последнего. Например, если есть существующий API, где ожидаемым параметром является массив, а у вас есть список.

Если вы оказались в таких ситуациях, вот несколько способов, которые могут помочь преобразовать список в массив на Java.
преобразование списка в массив java

 

Преобразовать список в массив с помощью toArray()

Самый простой способ преобразовать список в массив — это использовать встроенный метод toList(). Вот код:

Object[] toArray()

Этот метод не имеет аргумента и возвращает Object Array. Он создаёт новый массив, содержащий все элементы списка. Пример:

List myList = new ArrayList();
myList.add("Apple");
myList.add("Banana");
myList.add("Orange");
Object[] myArray = myList.toArray();
for (Object myObject : myArray) {
   System.out.println(myObject);
}

Как показано, toArray() возвращает массив объектов. myArray будет иметь 3 элемента — это то же самое, что и исходный список. Следовательно, ниже ожидаемый результат:
Apple
Banana
Orange

Обратите внимание, что тип возвращаемого значения — строго объектный массив. Если мы попытаемся привести результат к другому типу массива (например, массив строк), будет сгенерировано исключение.

Вот пример:

List myList = new ArrayList();
myList.add("Apple");
myList.add("Banana");
myList.add("Orange");
String[] myArray = (String[]) myList.toArray();

И ниже результат, когда код выше выполняется. ClassCastException выдает во время выполнения.
Exception in thread "main" java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.String;
at Test.main(Test.java:10)

toArray() должен возвращать «безопасный» массив — это означает, что List не будет ссылаться на элементы возвращаемого массива. Другими словами, если вы измените массив, список не будет затронут. Рассмотрим пример ниже:

List myList = new ArrayList();
myList.add("Apple");
myList.add("Banana");
myList.add("Orange");
Object[] myArray = myList.toArray();
myArray[0] = "X";
myArray[1] = "Y";
myArray[2] = "Z";
for (String myString:myList) {
   System.out.println(myString);
}

Изменение в результате (myArray) не повлияет на исходный список (myList). Следовательно, выходные данные кода будут отображать исходное содержимое списка, как показано ниже:
Apple
Banana
Orange

Конвертировать список в массив с помощью toArray (T [] a)

Если мы хотим, чтобы результат toArray возвращал определенный тип массива (например, массив строк), мы можем передать, какой тип он должен вернуть. Вот синтаксис:
T[] toArray(T[] a)
JavaDoc говорит, что параметр — это «массив, в котором должны храниться элементы этого списка, если он достаточно большой; в противном случае для этой цели выделяется новый массив того же типа».

List myList = new ArrayList();
myList.add("Apple");
myList.add("Banana");
myList.add("Orange");
String[] myArray = myList.toArray(new String[0]);
for (String myString : myArray) {
   System.out.println(myString);
}

Код передает массив String длиной 0. Поскольку элементы не помещаются, создается новый массив Array и возвращается вызывающей стороне.

В качестве альтернативы, мы можем передать массив, достаточно большой, чтобы содержать элементы списка. Вот пример:

List myList = new ArrayList();
myList.add("Apple");
myList.add("Banana");
myList.add("Orange");
String[] myArray = new String[3];
myList.toArray(myArray);
for (String myString:myArray) {
   System.out.println(myString);
}

Нам даже не нужно присваивать возврат метода toArray переменной. Содержимое хранится в параметре. myArray в этом случае получит значения List. И если мы запустим его, будет отображено следующее:
Apple
Banana
Orange

Подводный камень, который следует учитывать, заключается в том, что мы не можем автоматически преобразовать список определенного типа в массив другого типа с помощью метода toArray. Вот пример кода:

List myList = new ArrayList();
myList.add("100");
myList.add("200");
myList.add("300");
Integer[] myArray = myList.toArray(new Integer[0]);

Приведенный выше код создаст исключение ArrayStoreException. Потому что он не может преобразовать список строк в массив целых чисел.

Exception in thread "main" java.lang.ArrayStoreException
	at java.lang.System.arraycopy(Native Method)
	at java.util.Arrays.copyOf(Arrays.java:2775)
	at java.util.ArrayList.toArray(ArrayList.java:327)
	at Test.main(Test.java:10)

Используем пользовательский код

Можно использовать нашу собственную логику. Этот способ имеет некоторые преимущества. Вот простой пользовательский код для преобразования списка строк в массив строк Java.

List myList = new ArrayList();
myList.add("Apple");
myList.add("Banana");
myList.add("Orange");
String[] myArray = new String[myList.size()];
for (int i = 0; i < myList.size(); i++) {
   myArray[i] = myList.get(i);
}
for (String myString : myArray) {
   System.out.println(myString);
}

В итоге, получаем результат:
Apple
Banana
Orange

Одним из преимуществ использования пользовательского кода является то, что у нас может быть дополнительная логика, не включенная в готовые вспомогательные классы.

Например, если мы хотим преобразовать исходные элементы списка в элементы конечного массива. Вот простой пример:

List myList = new ArrayList();
myList.add("Apple");
myList.add("Banana");
myList.add("Orange");
String[] myArray = new String[myList.size()];
for (int i = 0; i < myList.size(); i++) {
   myArray[i] = "This is " + myList.get(i);
}
for (String myString : myArray) {
   System.out.println(myString);
}

Как показано, оригинальный список содержит названия фруктов. Результат содержит фразы, которые используют фрукты. Вывод:
This is Apple
This is Banana
This is Orange

Переделать список строк в целочисленный массив

Вот еще один пример пользовательского кода, в котором мы переделаем список строк в массив целых чисел.

List myList = new ArrayList();
myList.add("100");
myList.add("200");
myList.add("300");
Integer[] myArray = new Integer[myList.size()];
for (int i = 0; i < myList.size(); i++) {
   myArray[i] = Integer.valueOf(myList.get(i));
}
for (Integer myInt : myArray) {
   System.out.println(myInt);
}

Результат показан ниже:
100
200
300

В двойной массив

Аналогично, здесь приведен пример пользовательского кода, который преобразует List of String в массив значений Double.

List myList = new ArrayList();
myList.add("100.50");
myList.add("200.75");
myList.add("300.98");
Double[] myArray = new Double[myList.size()];
for (int i = 0; i < myList.size(); i++) {
   myArray[i] = Double.valueOf(myList.get(i));
}
for (Double myDouble : myArray) {
   System.out.println(myDouble);
}

Вывод:
100.5
200.75
300.98

С использованием потоков в Java 8

Поток Java 8 предлагает очень крутые способы преобразования объектов.

List myList = new ArrayList();
myList.add("Apple");
myList.add("Banana");
myList.add("Orange");
String[] myArray = myList.stream().toArray(String[]::new);

Оцени статью

Средняя оценка / 5. Количество голосов:

Спасибо, помогите другим - напишите комментарий, добавьте информации к статье.

Или поделись статьей

Видим, что вы не нашли ответ на свой вопрос.

Помогите улучшить статью.

 

Пока нет комментариев.

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

Ваш e-mail не будет опубликован.

СайдбарКомментарии (0)