可能重复:
Converting an array of objects to an array of their primitive types
我为Android制作了Parcel
而我正在尝试打包ArrayList<Long>
(toArray给我Long[]
)将其转换为long[]
,是否有一个简单的这样做的方法?
我意识到我可以循环,但我想我正在寻找更优雅的解决方案。
答案 0 :(得分:10)
您可以使用Apache commons ArrayUtils:
long[] longArray = ArrayUtils.toPrimitive(longObjectArray);
或Google的Guava:
long[] longArray = Longs.toArray(Arrays.asList(longObjectArray));
答案 1 :(得分:6)
不幸的是,没有比循环更简单的方法了。 This post是关于做相反的事情,但这个想法是一样的......
由于另一个答案推荐Apache Commons并且你在Android上 - 如果我要包含额外的依赖项,我宁愿选择guava Longs utility class:
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;
}
答案 2 :(得分:2)
Long
和long
是不同的类型。 Long
是一个班级。 long
是一个原始的。引入java 5的自动装箱可能会让一些人感到困惑,因为Long
和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没有任何区别。