可能重复:
将对象数组转换为原始类型数组
我Parcel
为Android制作了一个,我试图通过将它转换为来打包一个ArrayList<Long>
(toArray给我Long[]
)long[]
,有没有一种简单的方法可以做到这一点?
我意识到我可以循环,但我想我正在寻找一个更优雅的解决方案。
可能重复:
将对象数组转换为原始类型数组
我Parcel
为Android制作了一个,我试图通过将它转换为来打包一个ArrayList<Long>
(toArray给我Long[]
)long[]
,有没有一种简单的方法可以做到这一点?
我意识到我可以循环,但我想我正在寻找一个更优雅的解决方案。
您可以使用 Apache commons ArrayUtils:
long[] longArray = ArrayUtils.toPrimitive(longObjectArray);
或在 Google 的Guava中:
long[] longArray = Longs.toArray(Arrays.asList(longObjectArray));
不幸的是,没有比循环更简单的方法了。这篇文章是关于做相反的事情,但想法是一样的......
由于另一个答案推荐 Apache Commons 并且您使用的是 Android - 如果我要包含一个额外的依赖项,我宁愿选择guava Longs 实用程序类:
long[] primitive = Longs.toArray(listOfLongObjects);
供参考,代码为:
public static long[] toArray(Collection<? extends Number> collection) {
if (collection instanceof LongArrayAsList) {
return ((LongArrayAsList) collection).toLongArray();
}
Object[] boxedArray = collection.toArray();
int len = boxedArray.length;
long[] array = new long[len];
for (int i = 0; i < len; i++) {
// checkNotNull for GWT (do not optimize)
array[i] = ((Number) checkNotNull(boxedArray[i])).longValue();
}
return array;
}
Long
并且long
是不同的类型。Long
是一类。long
是原始的。Long
java 5 引入的自动装箱可能会让一些人感到困惑,因为和之间的双向转换long
是由编译器自动完成的。但是,这对于数组是不正确的。这意味着您必须创建新的类型数组long
并逐个元素地复制:
List<Long> list = new ArrayList<>();
// this way you create array of Long
Long[] arr1 = list.toArray(new Long[list.size()]);
// this way you create array of long
long[] arr2 = new long[list.size()];
int i = 0;
for (Long e : list) {
arr2[i++] = e; // autoboxing does the job here
}
显然,您可以使用System.arrcopy()
而不是自己编写循环。但是 id 没有任何区别。