如何在Java中从List <Double>转换为double []?

kam*_*aci 64 java double casting list

我有一个这样的变量:

List<Double> frameList =  new ArrayList<Double>();

/* Double elements has added to frameList */
Run Code Online (Sandbox Code Playgroud)

如何double[]在Java中使用具有高性能的变量来获取新变量?

Ale*_* C. 88

使用,您可以这样做.

double[] arr = frameList.stream().mapToDouble(Double::doubleValue).toArray(); //via method reference
double[] arr = frameList.stream().mapToDouble(d -> d).toArray(); //identity function, Java unboxes automatically to get the double value
Run Code Online (Sandbox Code Playgroud)

它的作用是:

  • 获得Stream<Double>从名单
  • 将每个double实例映射到其原始值,从而得到a DoubleStream
  • 打电话toArray()来获取阵列.


And*_*s_D 45

高性能 - 每个Double对象包含一个double值.如果要将所有这些值存储到double[]数组中,则必须迭代Double实例集合.一个O(1)映射是不可能的,这应该是你可以得到最快的:

 double[] target = new double[doubles.size()];
 for (int i = 0; i < target.length; i++) {
    target[i] = doubles.get(i).doubleValue();  // java 1.4 style
    // or:
    target[i] = doubles.get(i);                // java 1.5+ style (outboxing)
 }
Run Code Online (Sandbox Code Playgroud)

感谢评论中的其他问题;)以下是拟合ArrayUtils#toPrimitive方法的源代码:

public static double[] toPrimitive(Double[] array) {
  if (array == null) {
    return null;
  } else if (array.length == 0) {
    return EMPTY_DOUBLE_ARRAY;
  }
  final double[] result = new double[array.length];
  for (int i = 0; i < array.length; i++) {
    result[i] = array[i].doubleValue();
  }
  return result;
}
Run Code Online (Sandbox Code Playgroud)

(相信我,我没有用它作为我的第一个答案 - 即使它看起来......很相似:-D)

顺便说一句,Marcelos答案的复杂性是O(2n),因为它迭代了两次(幕后):首先Double[]从列表中创建一个,然后解开double值.

  • 从技术上讲,O(2n)= O(n) (8认同)

Col*_*inD 29

番石榴有一种方法可以为你做到这一点:double [] Doubles.toArray(Collection <Double>)

这不一定比通过循环Collection并将每个Double对象添加到数组更快,但是你写的要少得多.


Mar*_*elo 7

frameList.toArray(new double [0])

您可以使用commons-lang中的ArrayUtils类从Double []获取double [].

Double[] ds = frameList.toArray(new Double[frameList.size()]);
...
double[] d = ArrayUtils.toPrimitive(ds);
Run Code Online (Sandbox Code Playgroud)


Har*_*ime 5

您可以Double[]通过调用转换为a frameList.toArray(new Double[frameList.size()]),但是您需要迭代列表/数组才能转换为double[]


Pra*_*een 5

根据您的问题,

List<Double> frameList =  new ArrayList<Double>();
Run Code Online (Sandbox Code Playgroud)
  1. 首先,你必须转换List<Double>Double[]使用

    Double[] array = frameList.toArray(new Double[frameList.size()]);
    
    Run Code Online (Sandbox Code Playgroud)
  2. 接下来,你可以转换Double[]double[]使用

    double[] doubleArray = ArrayUtils.toPrimitive(array);
    
    Run Code Online (Sandbox Code Playgroud)

您可以直接在一行中使用它:

double[] array = ArrayUtils.toPrimitive(frameList.toArray(new Double[frameList.size()]));
Run Code Online (Sandbox Code Playgroud)