如何在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>();
-
首先你必须使用List将List转换为Double []
Double [] array = frameList.toArray(new Double [frameList.size()]);
-
接下来,您可以将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的贡献者。