Вопрос-ответ

How to convert an ArrayList containing Integers to primitive int array?

Как преобразовать ArrayList, содержащий целые числа, в примитивный массив int?

Я пытаюсь преобразовать ArrayList, содержащий целочисленные объекты, в примитивный int [] с помощью следующего фрагмента кода, но он выдает ошибку во время компиляции. Возможно ли преобразовать в Java?

List<Integer> x =  new ArrayList<Integer>();
int[] n = (int[])x.toArray(int[x.size()]);
Переведено автоматически
Ответ 1

Если вы используете , есть и другой способ сделать это.

int[] arr = list.stream().mapToInt(i -> i).toArray();

Что он делает, так это:


  • получение Stream<Integer> из списка

  • получение IntStream путем сопоставления каждого элемента с самим собой (функция идентификации), распаковки int значения, удерживаемого каждым Integer объектом (выполняется автоматически начиная с Java 5)

  • получение массива int путем вызова toArray

Вы также можете явно вызвать intValue через ссылку на метод, т.е:

int[] arr = list.stream().mapToInt(Integer::intValue).toArray();

Также стоит упомянуть, что вы могли бы получить NullPointerException если у вас есть какая-либо null ссылка в списке. Этого можно легко избежать, добавив условие фильтрации в конвейер stream, подобное этому:

                       //.filter(Objects::nonNull) also works
int[] arr = list.stream().filter(i -> i != null).mapToInt(i -> i).toArray();

Пример:

List<Integer> list = Arrays.asList(1, 2, 3, 4);
int[] arr = list.stream().mapToInt(i -> i).toArray(); //[1, 2, 3, 4]

list.set(1, null); //[1, null, 3, 4]
arr = list.stream().filter(i -> i != null).mapToInt(i -> i).toArray(); //[1, 3, 4]
Ответ 2

Вы можете преобразовать, но я не думаю, что есть что-то встроенное, чтобы сделать это автоматически:

public static int[] convertIntegers(List<Integer> integers)
{
int[] ret = new int[integers.size()];
for (int i=0; i < ret.length; i++)
{
ret[i] = integers.get(i).intValue();
}
return ret;
}

(Обратите внимание, что это вызовет исключение NullPointerException, если либо integers, либо любой элемент внутри него null.)

РЕДАКТИРОВАТЬ: Согласно комментариям, вы можете захотеть использовать итератор списка, чтобы избежать значительных затрат при работе со списками, такими как LinkedList:

public static int[] convertIntegers(List<Integer> integers)
{
int[] ret = new int[integers.size()];
Iterator<Integer> iterator = integers.iterator();
for (int i = 0; i < ret.length; i++)
{
ret[i] = iterator.next().intValue();
}
return ret;
}
Ответ 3

Google Guava

Google Guava предоставляет удобный способ сделать это, вызвав Ints.toArray.

List<Integer> list = ...;
int[] values = Ints.toArray(list);
Ответ 4

В Apache Commons есть класс ArrayUtils, в котором есть метод ToPrimitive(), который делает именно это.

import org.apache.commons.lang.ArrayUtils;
...
List<Integer> list = new ArrayList<Integer>();
list.add(new Integer(1));
list.add(new Integer(2));
int[] intArray = ArrayUtils.toPrimitive(list.toArray(new Integer[0]));

Однако, как показал Джон, это довольно легко сделать самостоятельно, вместо использования внешних библиотек.

java arrays arraylist