Как преобразовать int[] в List<Integer> в Java?
Как конвертировать int[]
в List<Integer>
в Java?
Я, конечно, заинтересован в любом решении, кроме как делать это в цикле, по элементу. Если других вариантов не будет, я выберу этот как лучший, чтобы показать, что такой функционал не является частью Java.
5 ответ(ов)
Нет простого способа преобразовать массив int[]
в List<Integer>
, поскольку метод Arrays.asList
не обрабатывает автопаковку и просто создаст List<int[]>
, что не является тем, что вам нужно. Вам придется создать вспомогательный метод.
int[] ints = {1, 2, 3};
List<Integer> intList = new ArrayList<Integer>(ints.length);
for (int i : ints) {
intList.add(i);
}
Этот код создает новый список List<Integer>
и заполняет его значениями из массива ints
.
Arrays.asList не будет работать так, как ожидают некоторые из других ответов.
Этот код не создаст список из 10 целых чисел. Он напечатает 1, а не 10:
int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
List lst = Arrays.asList(arr);
System.out.println(lst.size());
Вместо этого код ниже создаст список целых чисел:
List<Integer> lst = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
Если у вас уже есть массив целых чисел, нет простого способа конвертировать его в список. Лучше воспользоваться циклом.
С другой стороны, если ваш массив содержит объекты, а не примитивы, то Arrays.asList будет работать корректно:
String str[] = { "Гомер", "Мардж", "Барт", "Лиза", "Мэгги" };
List<String> lst = Arrays.asList(str);
В качестве альтернативного решения я предложу другой метод. Здесь использован анонимный класс без использования циклов, который делает применение автопаковки:
public List<Integer> asList(final int[] is) {
return new AbstractList<Integer>() {
public Integer get(int i) { return is[i]; }
public int size() { return is.length; }
};
}
Этот код создаёт список List<Integer>
, который позволяет работать с массивом примитивов int[]
как со списком объектов Integer
. Мы переопределяем методы get
и size
анонимного класса, что позволяет эффективно использовать автопаковку при обращении к элементам массива.
Самый компактный фрагмент кода будет следующим:
public List<Integer> myWork(int[] array) {
return Arrays.asList(ArrayUtils.toObject(array));
}
Где ArrayUtils
импортируется из библиотеки commons-lang
. Обратите внимание, что toObject
преобразует массив примитивов в массив объектов, что позволяет использовать его с Arrays.asList()
.
В Java 8 можно преобразовать массив int
в List<Integer>
с помощью стрима. Приведу два примера, как это можно сделать.
Первый способ — используя Collections.addAll
:
int[] ints = {1, 2, 3};
List<Integer> list = new ArrayList<Integer>();
Collections.addAll(list, Arrays.stream(ints).boxed().toArray(Integer[]::new));
В этом примере мы создаем новый ArrayList
, затем используем Arrays.stream(ints)
для получения стрима из массива и преобразовываем его в объекты Integer
с помощью boxed()
. После этого мы преобразуем стрим в массив Integer[]
с помощью toArray
, который затем добавляется в список.
Второй способ — с использованием Collectors
:
List<Integer> list = Arrays.stream(ints).boxed().collect(Collectors.toList());
Этот способ более лаконичен. Мы просто создаем стрим из массива ints
, применяем boxed()
для конвертации примитивных int
в объекты Integer
, а затем собираем результаты в список с помощью Collectors.toList()
.
Оба способа корректны, но второй выглядит более элегантно и предпочтительнее.
Преобразование 'ArrayList<String>' в 'String[]' в Java
Как преобразовать массив в множество в Java
Инициализация ArrayList в одну строчку
Почему нет ConcurrentHashSet, если есть ConcurrentHashMap?
Как объявить массив в одну строку?