Ответ 1
К сожалению, на платформе Java ничего нет. Кстати, вам также нужно явно обрабатывать элементы null
в массиве Integer[]
(что int
вы собираетесь использовать для них?).
Если у вас есть массив объектов Java, которые имеют примитивный тип (например, Byte, Integer, Char и т.д.). Есть ли опрятный способ, я могу преобразовать его в массив примитивного типа? В частности, это можно сделать без необходимости создания нового массива и прокрутки содержимого.
Так, например, данный
Integer[] array
Каков наилучший способ конвертировать это в
int[] intArray
К сожалению, это то, что мы должны делать довольно часто при взаимодействии между Hibernate и некоторыми сторонними библиотеками, над которыми у нас нет контроля. Кажется, это была бы довольно распространенная операция, поэтому я был бы удивлен, если бы не было ярлыка.
Спасибо за вашу помощь!
К сожалению, на платформе Java ничего нет. Кстати, вам также нужно явно обрабатывать элементы null
в массиве Integer[]
(что int
вы собираетесь использовать для них?).
Еще раз, Apache Commons Lang является вашим другом. Они обеспечивают ArrayUtils.toPrimitive(), который делает именно то, что вам нужно. Вы можете указать, как вы хотите обрабатывать нули.
С потоками, представленными на 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
.
Использование Guava:
int[] intArray = Ints.toArray(Arrays.asList(array));
Документация:
Arrays.asList
(Core API)Ints.toArray
(Guava)В частности, это можно сделать без необходимости создания нового массива и прокрутки содержимого.
Вы не можете преобразовать массив 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++;
}
с помощью Dollar прост как:
Integer[] array = ...;
int[] primitiveArray = $(array).toIntArray();