Я пытаюсь преобразовать ArrayList, содержащий объекты Integer, в примитив int [] со следующим фрагментом кода, но он выдает ошибку времени компиляции. Можно ли конвертировать в Java?
List<Integer> x = new ArrayList<Integer>();
int[] n = (int[])x.toArray(int[x.size()]);
java
arrays
arraylist
primitive-types
Snehal
источник
источник
List<Integer> x = new ArrayList<Integer>();
Integer[] n = x.toArray(new Integer[0]);
Ответы:
Вы можете конвертировать, но я не думаю, что есть что-то встроенное, чтобы сделать это автоматически:
(Обратите внимание, что это вызовет исключение NullPointerException, если один
integers
или любой элемент в нем естьnull
.)РЕДАКТИРОВАТЬ: Согласно комментариям, вы можете использовать итератор списка, чтобы избежать неприятных затрат со списками, такими как
LinkedList
:источник
integers.stream().mapToInt(Integer::valueOf).toArray
Если вы используете Java-8 есть и другой способ сделать это.
Что это делает:
Stream<Integer>
из спискаIntStream
путем сопоставления каждого элемента себе (функция идентификации), распаковкаint
значения, удерживаемого каждымInteger
объектом (выполняется автоматически, начиная с Java 5)int
по вызовуtoArray
Вы также можете явно вызвать
intValue
через ссылку на метод, то есть:Также стоит упомянуть, что вы можете получить,
NullPointerException
если у вас есть какая-либоnull
ссылка в списке. Этого можно легко избежать, добавив условие фильтрации в конвейер потока следующим образом:Пример:
источник
double
типов; нет ли эквивалента дляfloat
типов?Google Guava
Google Guava предоставляет удобный способ сделать это, позвонив по телефону
Ints.toArray
.источник
В Apache Commons есть класс ArrayUtils, у которого есть метод toPrimitive (), который делает именно это.
Однако, как показал Джон, довольно легко сделать это самостоятельно, вместо использования внешних библиотек.
источник
Я считаю, что итерация с использованием итератора List является лучшей идеей, поскольку
list.get(i)
может иметь низкую производительность в зависимости от реализации List:источник
Использование Dollar должно быть довольно простым:
Я планирую улучшить DSL, чтобы удалить промежуточный
toArray()
вызовисточник
Это хорошо работает для меня :)
Находится на https://www.techiedelight.com/convert-list-integer-array-int/
источник
Меня удивляет, что мы поощряем одноразовые пользовательские методы всякий раз, когда совершенно хорошая, хорошо используемая библиотека, такая как Apache Commons, уже решила проблему. Хотя решение тривиально, если не абсурдно, безответственно поощрять такое поведение из-за длительного обслуживания и доступности.
Просто зайдите с Apache Commons
источник
Если вы используете Eclipse Collections , вы можете использовать этот
collectInt()
метод для переключения из контейнера объектов в примитивный контейнер int.Если вы можете преобразовать
ArrayList
его вFastList
, вы можете избавиться от адаптера.Примечание: я являюсь коммиттером для коллекций Eclipse.
источник
Java 8:
источник
Arrays.setAll ()
Вывод:
Один и то же произведение для массива
long
илиdouble
, но не для массивовboolean
,char
,byte
,short
илиfloat
. Если у вас действительно огромный список, есть дажеparallelSetAll
метод, который вы можете использовать вместо этого.Для меня это хорошо и достаточно изящно, так что я бы не хотел получать внешнюю библиотеку или использовать для нее потоки.
Ссылка на документацию:
Arrays.setAll(int[], IntUnaryOperator)
источник
Вы можете просто скопировать его в массив:
Не слишком причудливый; но, эй, это работает ...
источник
Очень простое однострочное решение:
источник
Этот сегмент кода работает для меня, попробуйте это:
Стоит отметить, что ArrayList должен быть объявлен так:
источник
источник
доступ
arr
вроде нормальныйint[]
.источник