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

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

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

Integer[] array

Каков наилучший способ конвертировать это в

int[] intArray

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

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

Ответ 1

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

Ответ 2

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

Ответ 3

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

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

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

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

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

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

Все они будут бросать NullPointerException, если любой из ваших элементов null.

Ответ 4

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

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

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

Ответ 5

В частности, это можно сделать без необходимости создания нового массива и прокрутки содержимого.

Вы не можете преобразовать массив 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.

Ответ 6

Или просто сделайте это легко, если вы сделаете это только один раз. Но вы не говорили о 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++;
    }

Ответ 7

с помощью Dollar прост как:

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