2011-05-30 22 views
20

¿Hay algún método de utilidad para convertir una lista de tipos numéricos en una matriz de tipo primitivo? En otras palabras, estoy buscando una mejor solución que esta.¿Cuál es la mejor forma de convertir el objeto List <Long> a long [] array en java?

private long[] toArray(List<Long> values) { 
    long[] result = new long[values.size()]; 
    int i = 0; 
    for (Long l : values) 
     result[i++] = l; 
    return result; 
} 
+0

Ver http://stackoverflow.com/questions/3770289/converting-array-of-primitives-to-array-of-containers-in- java –

+0

como Desea todavía su solución, no olvide 'l.longValue();' –

+1

@Vash: 'longValue()' no es necesario ya que hay autoboxing – Jonathan

Respuesta

22

Desde Java 8, puede hacer lo siguiente:

long[] result = values.stream().mapToLong(l -> l).toArray(); 

¿Qué está pasando aquí?

  1. Convertimos el List<Long> en un Stream<Long>.
  2. Llamamos mapToLong en él para obtener un LongStream
    • El argumento para mapToLong es un ToLongFunction, que tiene una long como el tipo de resultado.
    • Porque Java desboxes automáticamente un Long a un long, escribiendo l -> l como funciona la expresión lambda. El Long se convierte a long allí. También podríamos ser más explícitos y usar Long::longValue en su lugar.
  3. Llamamos toArray, que devuelve un long[]
+0

¿Puedes explicarnos qué está pasando aquí? – VaidAbhishek

+0

@VaidAbhishek Hecho :). – robinst

+0

Intenté devolver Long [] con su ejemplo, pero aún así cuando llamo a Array, devuelve long []. ¿Puedes dar un llamado completo al método para devolver Long [] –

7

Uso ArrayUtils.toPrimitive(Long[] array) de Apache Commons.

Long[] l = values.toArray(new Long[values.size()]); 
long[] l = ArrayUtils.toPrimitive(l); 
+1

Es posible que deba especificar que desea una matriz 'long' devuelto: 'values.toArray (new long [0]);' –

+3

@Gary Buyn: no se pueden usar tipos primitivos como argumentos genéricos. –

+1

No sé por qué obtienes 4 votos pero este código ni siquiera compila que no puedes enviar desde Object [] a long []. –

1

No recuerdo sobre algún método nativo que va a hacer eso, pero lo que es malo en la creación de un uno mismo ;-).

public class YasinUtilities { 

    public static long[] toArray(Iterator<Long) values) { //Better choice would be Enumerator but easier is this way. 

     if(value == null) { 
     //return null or throw exception 
     } 

     long[] result = new long[values.size()]; 

     Long current = null; 
     int i = 0; 
     while(values.hasNext()) { 

     current = values.next(); 

     if(current == null) { 
     result[i++] = 0L; //or -1; 
     } else { 
     result[i++] = current.longValue(); 
     } 
     } 
    } 
} 
+1

¿Y por qué? ... –

Cuestiones relacionadas