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

2022-08-31 12:05:03

我有一个这样的变量:

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

/* Double elements has added to frameList */

在Java中,我如何才能让一个新变量具有高性能的变量类型?double[]


答案 1

使用,你可以这样做。

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

它的作用是:

  • 从列表中获取Stream<Double>
  • 将每个双精度实例映射到其基元值,从而生成DoubleStream
  • 调用以获取数组。toArray()

答案 2

高性能 - 每个对象包装一个值。如果要将所有这些值存储到数组中,则必须循环访问实例集合。映射是不可能的,这应该是你能得到的最快:Doubledoubledouble[]DoubleO(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)
 }

感谢您在评论中的附加问题;)以下是拟合方法的源代码: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;
}

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

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