I'm implementing an interface that has functionality similar to a table that can contain an types of objects. The interface specifies the following function:
double[] getDoubles(int columnIndex);
Where I'm stumped is that in my implementation, I'm storing the table data in a 2D Object
array (Object[][] data
). When I need to return the values, I want to do the following (it is assumed that getDoubles()
will only be called on a column that contains doubles, so there will be no ClassCastExceptions
):
double[] getDoubles(int columnIndex) { return (double[]) data[columnIndex]; }
But - Java doesn't allow Object[]
to be cast to double[]
. Casting it to Double[]
is ok because Double
is an object and not a primitive, but my interface specifies that data will be returned as a double[]
.
So I have two questions:
Object[][]
table and return the array of primitives?Double[]
, will there be any performance impact?To convert double primitive type to a Double object, you need to use Double constructor. Let's say the following is our double primitive. // double primitive double val = 23.78; To convert it to a Double object, use Double constructor.
There are three ways to convert a String to double value in Java, Double. parseDouble() method, Double. valueOf() method and by using new Double() constructor and then storing the resulting object into a primitive double field, autoboxing in Java will convert a Double object to the double primitive in no time.
If you don't mind using a 3rd party library, commons-lang has the ArrayUtils type with various methods for manipulation.
Double[] doubles; ... double[] d = ArrayUtils.toPrimitive(doubles);
There is also the complementary method
doubles = ArrayUtils.toObject(d);
Edit: To answer the rest of the question. There will be some overhead to doing this, but unless the array is really big you shouldn't worry about it. Test it first to see if it is a problem before refactoring.
Implementing the method you had actually asked about would give something like this.
double[] getDoubles(int columnIndex) { return ArrayUtils.toPrimitive(data[columnIndex]); }
In Java 8, this is one-liner:
Double[] boxed = new Double[] { 1.0, 2.0, 3.0 }; double[] unboxed = Stream.of(boxed).mapToDouble(Double::doubleValue).toArray();
Note that this still iterates over the original array and creates a new one.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With