¿Cómo convierto Double a double ?

Estoy implementando una interfaz que tiene una funcionalidad similar a una tabla que puede contener un tipo de objetos. La interfaz especifica la siguiente función:

double[] getDoubles(int columnIndex); 

Donde estoy perplejo es que en mi implementación, estoy almacenando los datos de la tabla en una matriz de Object 2D (datos de Object[][] data ). Cuando necesito devolver los valores, quiero hacer lo siguiente (se supone que getDoubles() solo se getDoubles() en una columna que contenga dobles, por lo que no habrá ClassCastExceptions ):

 double[] getDoubles(int columnIndex) { return (double[]) data[columnIndex]; } 

Pero – Java no permite que Object[] sea ​​lanzado al double[] . Convertirlo en Double[] está bien porque el Double es un objeto y no una primitiva, pero mi interfaz especifica que los datos se devolverán como un double[] .

Entonces tengo dos preguntas:

  1. ¿Hay alguna forma de que pueda obtener los datos de la columna de la tabla Object[][] y devolver la matriz de primitivos?
  2. Si cambio la interfaz para devolver Double[] , ¿habrá algún impacto en el rendimiento?

Desafortunadamente, tendrá que recorrer toda la lista y desempaquetar el Double si desea convertirlo a un double[] .

En lo que respecta al rendimiento, hay un tiempo asociado con las primitivas de boxeo y unboxing en Java. Si el conjunto es lo suficientemente pequeño, no verá ningún problema de rendimiento.

Si no te importa utilizar una biblioteca de terceros, commons-lang tiene el tipo de ArrayUtils con varios métodos de manipulación.

 Double[] doubles; ... double[] d = ArrayUtils.toPrimitive(doubles); 

También existe el método complementario

 doubles = ArrayUtils.toObject(d); 

Editar: para responder el rest de la pregunta. Habrá algunos gastos generales para hacer esto, pero a menos que la matriz sea realmente grande, no debes preocuparte por ello. Pruébelo primero para ver si es un problema antes de refactorizar.

Implementar el método que realmente había preguntado daría algo como esto.

 double[] getDoubles(int columnIndex) { return ArrayUtils.toPrimitive(data[columnIndex]); } 

En Java 8, esto es de una sola línea:

 Double[] boxed = new Double[] { 1.0, 2.0, 3.0 }; double[] unboxed = Stream.of(boxed).mapToDouble(Double::doubleValue).toArray(); 

Tenga en cuenta que esto aún se repite sobre la matriz original y crea una nueva.

Puede usar a para cada ciclo para construir una matriz temporal del mismo tamaño y luego convertir cada elemento individual en el doble, pero en la matriz.

ASI QUE:

 double[] tempArray = new double[data[columnIndex].length]; int i = 0; for(Double d : (Double) data[columnIndex]) { tempArray[i] = (double) d; i++; } 

Por favor corrígeme si estoy completamente equivocado aquí.

Si desea devolver un double[] , deberá crear un new double[] , rellenarlo y devolverlo.

Esa puede ser una buena decisión de architecture. Primero, no tiene mucho sentido lanzar un Object[] a un Double[] ; en realidad no es una matriz de Double porque podría haber Object también. En segundo lugar, si devuelve la matriz directamente, el código de usuario puede modificarla y alterar la estructura interna de su objeto.

El principal impacto en el rendimiento sería devolver una matriz de double[] , debido al desempaquetado y al costo de la asignación.

No tengo nada que agregar a la pregunta real más allá de lo que dijeron Jjnguy y Eric Koslow.

Pero solo una nota al margen: Usted menciona el lanzamiento de una matriz de Objetos a una matriz Doble. Lo siguiente NO funcionará:

 Object[] oa=new Object[3]; oa[0]=new Double("1.0"); oa[1]=new Double("2.0"); oa[2]=new Double("3.0"); Double[] da=(Double[])oa; 

La última línea lanzará una excepción de lanzamiento de clase. Aunque cada elemento de la matriz es de hecho un doble, la matriz se creó como una matriz de objetos, no una matriz de dobles, por lo que el yeso no es válido.

Yo pondría en segundo plano la respuesta de ArrayUtils y agregaría que la documentación de 1.5 autoboxing (a través de ) muestra un poco que no hay una forma integrada:

No se permite la conversión del tipo de matriz SC [] al tipo de matriz TC [] si no se permite otra conversión que una conversión de cadena de SC a TC

Puede utilizar ArrayUtils para convertir

 Double[] d; // initialise double[] array = ArrayUtils.toPrimitive(d); 

No es necesario buclear toda la información.