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

我有一个像这样的variables:

List<Double> frameList = new ArrayList<Double>(); /* Double elements has added to frameList */ 

我怎样才能有一个新的variables有一个types的double[]从Javavariables高性能?

高性能 – 每个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) } 

感谢评论中的附加问题;)下面是配件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),因为它迭代了两次(在幕后):首先从列表中创build一个Double[] ,然后解开double值。

用java-8 ,你可以这样做。

 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()来获取数组。

番石榴有一个方法来为你做这个: double [] Doubles.toArray(Collection <Double>)

这不一定会比通过循环访问Collection并将每个Double对象添加到数组的速度要快,但是写起来要less得多。

你可以通过调用frameList.toArray(new Double[frameList.size()])来转换为Double[] ,但是你需要迭代list / array来转换为double[]

frameList.toArray(new double [0])

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

 Double[] ds = frameList.toArray(new Double[frameList.size()]); ... double[] d = ArrayUtils.toPrimitive(ds); 

根据你的问题,

 List<Double> frameList = new ArrayList<Double>(); 
  1. 首先你必须使用List将List转换为Double []

    Double [] array = frameList.toArray(new Double [frameList.size()]);

  2. 接下来,您可以将Double []转换为double []

    double [] doubleArray = ArrayUtils.toPrimitive(array);

你可以直接在一行中使用它,

 double[] array = ArrayUtils.toPrimitive(frameList.toArray(new Double[frameList.size()]); 

您可以使用Eclipse集合中的原始集合,并完全避免装箱。

 DoubleList frameList = DoubleLists.mutable.empty(); double[] arr = frameList.toArray(); 

如果你不能或不想初始化一个DoubleList

 List<Double> frames = new ArrayList<>(); double[] arr = ListAdapter.adapt(frames).asLazy().collectDouble(each -> each).toArray(); 

注意:我是Eclipse Collections的贡献者。