Come eseguire il cast da List a double in Java?

Ho una variabile del genere:

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

Come posso avere una nuova variabile ha un tipo di double[] da quella variabile in Java ad alte prestazioni?

Prestazioni elevate: ogni object Double racchiude un singolo valore double . Se si desidera memorizzare tutti questi valori in un array double[] , è necessario eseguire iterazioni sulla raccolta di istanze Double . Una mapping O(1) non è ansible, questo dovrebbe essere il più veloce che puoi ottenere:

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

Grazie per la domanda aggiuntiva nei commenti;) Ecco il codice sorgente del metodo di assembly ArrayUtils#toPrimitive :

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

(E credimi, non l'ho usato per la mia prima risposta - anche se sembra ... abbastanza simile MrGreen)

A proposito, la complessità della risposta di Marcelos è O (2n), perché itera due volte (dietro le quinte): prima di fare un Double[] dall'elenco, quindi di scartare i valori double .

Con java-8 , puoi farlo in questo modo.

 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 

Quello che fa è:

  • ottenere lo Stream dall’elenco
  • mappare ogni doppia istanza al suo valore primitivo, risultando in un DoubleStream
  • chiamare toArray() per ottenere l’array.

Guava ha un metodo per farlo per te: double [] Doubles.toArray (Collection )

Questo non sarà necessariamente più veloce del semplice looping della Collection e aggiungendo ogni object Double all’array, ma è molto meno da scrivere.

frameList.toArray (nuovo doppio [0])

Puoi usare la class ArrayUtils da commons-lang per ottenere un doppio [] da un Double [].

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

È ansible convertire in Double[] chiamando frameList.toArray(new Double[frameList.size()]) , ma sarà necessario iterare la lista / array per convertire in double[]

Secondo la tua domanda,

 List frameList = new ArrayList(); 
  1. Per prima cosa devi convertire List in Double [] usando

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

  2. Quindi puoi convertire Double [] in double [] usando

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

Puoi utilizzarlo direttamente in una riga,

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

Puoi utilizzare raccolte primitive da raccolte Eclipse ed evitare del tutto la boxe.

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

Se non puoi o non vuoi inizializzare una DoubleList :

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

Nota: sono un collaboratore di Eclipse Collections.