如果您有一个具有基本类型的Java对象数组(例如Byte,Integer,Char等)。有没有一种简洁的方法我可以将它转换为原始类型的数组?特别是可以在不必创建新数组并遍历内容的情况下完成此操作。
例如,给定
Integer[] array
将此转换为
的最佳方法是什么?int[] intArray
不幸的是,当Hibernate与我们无法控制的某些第三方库之间进行交互时,我们必须经常这样做。这似乎是一个非常常见的操作,所以如果没有捷径我会感到惊讶。
感谢您的帮助!
答案 0 :(得分:88)
再一次,Apache Commons Lang是你的朋友。他们提供ArrayUtils.toPrimitive(),它完全符合您的需要。您可以指定处理空值的方式。
答案 1 :(得分:57)
在Java 8中引入streams,可以这样做:
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
。
答案 2 :(得分:37)
不幸的是,Java平台中没有任何内容可以做到这一点。顺便说一下,你还需要明确处理null
数组中的Integer[]
个元素(那些int
会用于那些?)。
答案 3 :(得分:24)
使用Guava:
int[] intArray = Ints.toArray(Arrays.asList(array));
文档:
Arrays.asList
(核心API)Ints.toArray
(番石榴)答案 4 :(得分:3)
特别是可以在不必创建新数组并遍历内容的情况下完成此操作。
您无法在Java中将Integer数组转换为int(即,您无法更改数组元素的类型)。因此,您必须创建一个新的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。
答案 5 :(得分:2)
如果你只做一次,那么就这么简单。但你还没有谈到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++;
}
答案 6 :(得分:1)
使用Dollar很简单:
Integer[] array = ...;
int[] primitiveArray = $(array).toIntArray();
答案 7 :(得分:0)
这是所有原始类型的通用解决方案
/**
* Convert Collection to equivalent array of primitive type
* @param <S> [in] Object type of source collection
* @param tcls [in] class of the primitive element
* @param q [in] source collection
* @return Equivalent Array of tcls-elements, requires cast to "tcls"[]
*/
public static <S> Object asPrimitiveArray(Class<?> tcls, Collection<S> q)
{
int n = q.size();
Object res = Array.newInstance(tcls, n);
Iterator<S> i = q.iterator();
int j = 0;
while (i.hasNext())
{
Array.set(res, j++, i.next());
}
return res;
}
/**
* Convert Object array to equivalent array of primitive type
* @param <S> [in] Object type of source array
* @param tcls [in] class of the primitive element
* @param s [in] source array
* @return Equivalent Array of tcls-elements, requires cast to "tcls"[]
*/
public static <S> Object asPrimitiveArray(Class<?> tcls, S[] s)
{
return asPrimitiveArray(tcls, Arrays.asList(s));
}
整数到整数的转换
Integer[] a = ...
int[] t = (int[]) asPrimitiveArray(int.class, a);