施放长[]到长[]

时间:2012-11-24 18:08:52

标签: java android

  

可能重复:
  Converting an array of objects to an array of their primitive types

我为Android制作了Parcel而我正在尝试打包ArrayList<Long>(toArray给我Long[])将其转换为long[],是否有一个简单的这样做的方法?

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

3 个答案:

答案 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)

Longlong是不同的类型。 Long是一个班级。 long是一个原始的。引入java 5的自动装箱可能会让一些人感到困惑,因为Longlong之间的双向转换是由编译器自动完成的。但是这对于数组来说是不正确的。这意味着您必须创建类型为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没有任何区别。