3

可能重复:
将对象数组转换为原始类型数组

Parcel为Android制作了一个,我试图通过将它转换为来打包一个ArrayList<Long>(toArray给我Long[]long[],有没有一种简单的方法可以做到这一点?

我意识到我可以循环,但我想我正在寻找一个更优雅的解决方案。

4

3 回答 3

10

您可以使用 Apache commons ArrayUtils

long[] longArray = ArrayUtils.toPrimitive(longObjectArray);

或在 Google 的Guava中:

long[] longArray = Longs.toArray(Arrays.asList(longObjectArray));
于 2012-11-24T18:11:00.100 回答
6

不幸的是,没有比循环更简单的方法了。这篇文章是关于做相反的事情,但想法是一样的......

由于另一个答案推荐 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;
  }
于 2012-11-24T18:11:21.340 回答
2

Long并且long是不同的类型。Long是一类。long是原始的。Longjava 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 没有任何区别。

于 2012-11-24T18:16:16.433 回答