¿Cómo transmitir desde la Lista al doble en Java?

Tengo una variable como esa:

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

¿Cómo puedo tener una nueva variable con un tipo de double[] de esa variable en Java con alto rendimiento?

Alto rendimiento: cada objeto Double envuelve un solo valor double . Si desea almacenar todos estos valores en una matriz double[] , debe iterar sobre la colección de instancias Double . Un mapeo O(1) no es posible, este debería ser el más rápido que puedas obtener:

  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) } 

Gracias por la pregunta adicional en los comentarios;) Aquí está el código fuente del método ArrayUtils#toPrimitive apropiado:

 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; } 

(Y créanme, no lo usé para mi primera respuesta, aunque parece ... bastante similar :-D)

Por cierto, la complejidad de la respuesta de Marcelos es O (2n), ya que itera dos veces (detrás de las escenas): primero para hacer un Double[] de la lista, luego para desenvolver los valores double .

Con java-8 , puedes hacerlo de esta manera.

 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 

Lo que hace es:

  • obtener el Stream de la lista
  • asigna cada instancia doble a su valor primitivo, lo que da como resultado un DoubleStream
  • llama a toArray() para obtener la matriz.

Guava tiene un método para hacer esto por usted: double [] Doubles.toArray (Collection )

Esto no necesariamente va a ser más rápido que solo recorrer la Collection y agregar cada objeto Double a la matriz, pero es mucho menos para que escriba.

frameList.toArray (nuevo doble [0])

Puede usar la clase ArrayUtils de commons-lang para obtener un doble [] de un doble [].

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

Puede convertir a Double[] llamando a frameList.toArray(new Double[frameList.size()]) , pero necesitará iterar la lista / matriz para convertir a double[]

Según su pregunta,

 List frameList = new ArrayList(); 
  1. Primero debes convertir la Lista a Doble [] usando

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

  2. Luego puede convertir Doble [] a doble [] usando

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

Puedes usarlo directamente en una línea,

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

Puede usar colecciones primitivas de colecciones de Eclipse y evitar el boxeo por completo.

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

Si no puede o no quiere inicializar una DoubleList :

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

Nota: soy colaborador de las colecciones de Eclipse.