Преобразование массива объектов в массив их примитивных типов

Если у вас есть массив объектов Java, которые имеют примитивный тип (например, Byte, Integer, Char и т. Д.). Есть ли опрятный способ, я могу преобразовать его в массив примитивного типа? В частности, это можно сделать, не создавая новый массив и не зацикливая содержимое.

Так, например, данный

Integer[] array 

что является самым простым способом превратить это в

 int[] intArray 

К сожалению, это то, что нам нужно делать довольно часто при взаимодействии между Hibernate и некоторыми сторонними библиотеками, над которыми мы не контролируем. Кажется, это была бы довольно распространенная операция, поэтому я был бы удивлен, если нет ярлыка.

Спасибо за вашу помощь!

    К сожалению, на платформе Java нет ничего такого. Кстати, вам также нужно явно обрабатывать null элементы в массиве Integer[] (какой int вы собираетесь использовать для этих?).

    Еще раз, Apache Commons Lang – ваш друг. Они предоставляют ArrayUtils.toPrimitive (), который делает именно то, что вам нужно. Вы можете указать, как вы хотите обрабатывать нули.

    С streamами, введенными в Java 8, это можно сделать:

     int[] intArray = Arrays.stream(array).mapToInt(Integer::intValue).toArray(); 

    Однако в настоящее время существуют только примитивные streamи для int , long и double . Если вам нужно преобразовать в другой примитивный тип, такой как byte самый короткий путь без внешней библиотеки – это:

     byte[] byteArray = new byte[array.length]; for(int i = 0; i < array.length; i++) byteArray[i] = array[i]; 

    Или цикл for может быть заменен streamом, если вы хотите:

     IntStream.range(0, array.length).forEach(i -> byteArray[i] = array[i]); 

    Все это вызовет NullPointerException если любой из ваших элементов null .

    Использование Guava :

     int[] intArray = Ints.toArray(Arrays.asList(array)); 

    Документация:

    • Arrays.asList (Core API)
    • Ints.toArray ( Ints.toArray )

    В частности, это можно сделать, не создавая новый массив и не зацикливая содержимое.

    Вы не можете преобразовать массив Integer в int (т. Е. Вы не можете изменить тип элементов массива) в Java. Таким образом, вы либо должны создать новый массив int [], либо скопировать значение объектов Integer в него или использовать адаптер:

     class IntAdapter { private Integer[] array; public IntAdapter (Integer[] array) { this.array = array; } public int get (int index) { return array[index].intValue(); } } 

    Это может сделать ваш код немного более читаемым, и объект IntAdapter будет потреблять только несколько байтов памяти. Большим преимуществом адаптера является то, что вы можете обрабатывать специальные случаи:

     class IntAdapter { private Integer[] array; public int nullValue = 0; public IntAdapter (Integer[] array) { this.array = array; } public int get (int index) { return array[index] == null ? nullValue : array[index].intValue(); } } 

    Другое решение – использовать Commons Primitives, который содержит множество предопределенных адаптеров. В вашем случае посмотрите ListIntList .

    Или просто сделайте это легко, если вы сделаете это только один раз. Но вы не говорили о Integer! = Null case.

      //array is the Integer array int[] array2 = new int[array.length]; int i=0; for (Integer integer : array) { array2[i] = integer.intValue(); i++; } 

    использование Доллара прост как:

     Integer[] array = ...; int[] primitiveArray = $(array).toIntArray(); 
    Interesting Posts

    Что подразумевается под инициализацией ресурсов (RAII)?

    Почему некорректная попытка пароля занимает намного больше времени, чем правильная?

    Могу ли я заставить JAXB не преобразовывать «в», например, при сортировке XML?

    Javac: обрабатывать предупреждения как ошибки

    Независимо от платформы size_t Спецификаторы формата в c?

    Java, изменение содержимого ячейки как функции другой ячейки в той же строке

    Программа не выполняет gets () после scanf (), даже используя fflush (stdin)

    Как я могу совместно использовать интернет-соединение между двумя ноутбуками?

    В чем разница между Cache-Control: max-age = 0 и no-cache?

    Каков наилучший способ клонирования раздела Linux на меньший раздел?

    В чем разница между свойствами Dependency SetValue () и SetCurrentValue ()

    Кэширование Android Volley + JSONObjectRequest

    Почему String.replaceAll () в java требует 4 слэша «\\\\» в regex, чтобы фактически заменить «\»?

    Windows 10 Ошибка страницы BSOD в области без подкачки (только во время торрента)

    Установите Google Chrome в AppData \ Local \ Google \ Chrome \ Application

    Давайте будем гением компьютера.