How to cast from List<Double> to double[] in Java?
I have a variable like that:
List<Double> frameList = new ArrayList<Double>();
/* 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?
Solution 1:
With java-8, 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<Double>
from the list - map each double instance to its primitive value, resulting in a
DoubleStream
- call
toArray()
to get the array.
Solution 2:
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 < target.length; i++) {
target[i] = doubles.get(i).doubleValue(); // java 1.4 style
// or:
target[i] = doubles.get(i); // java 1.5+ style (outboxing)
}
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 < array.length; i++) {
result[i] = array[i].doubleValue();
}
return result;
}
(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.
Solution 3:
Guava has a method to do this for you: double[] Doubles.toArray(Collection<Double>)
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.