How to cast from List<Double> to double[] in Java?

匿名 (未验证) 提交于 2019-12-03 08:42:37

问题:

I have a variable like that:

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

How can I have a new variable has a type of double[] from that variable in Java with high performance?

回答1:

High performance - every Double object wraps a single double value. If you want to store all these values into a double[] array, then you have to iterate over the collection of Double instances. A O(1) mapping is not possible, this should be the fastest you can get:

 double[] target = new double[doubles.size()];  for (int i = 0; i 

Thanks for the additional question in the comments ;) Here's the sourcecode of the fitting ArrayUtils#toPrimitive method:

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 

(And trust me, I didn't use it for my first answer - even though it looks ... pretty similiar :-D )

By the way, the complexity of Marcelos answer is O(2n), because it iterates twice (behind the scenes): first to make a Double[] from the list, then to unwrap the double values.



回答2:

With , you can do it this way.

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 

What it does is :

  • get the Stream from the list
  • map each double instance to its primitive value, resulting in a DoubleStream
  • call toArray() to get the array.


回答3:

Guava has a method to do this for you: double[] Doubles.toArray(Collection)

This isn't necessarily going to be any faster than just looping through the Collection and adding each Double object to the array, but it's a lot less for you to write.



回答4:

frameList.toArray(new double[0])

You can use the ArrayUtils class from commons-lang to obtain a double[] from a Double[].

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


回答5:

You can convert to a Double[] by calling frameList.toArray(new Double[frameList.size()]), but you'll need to iterate the list/array to convert to double[]



回答6:

As per your question,

List frameList =  new ArrayList(); 
  1. First you have to convert List to Double[] by using

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

  2. Next you can convert Double[] to double[] using

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

You can directly use it in one line,

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


回答7:

You can use primitive collections from Eclipse Collections and avoid boxing altogether.

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

If you can't or don't want to initialize a DoubleList:

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

Note: I am a contributor to Eclipse Collections.



标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!