Converti un array di primitive in un elenco

1. Panoramica

In questo breve tutorial, mostreremo come convertire un array di primitive in un elenco di oggetti del tipo corrispondente . In genere, potremmo provare a utilizzare l'autoboxing in Java. Tuttavia, come vedremo nella prossima sezione, la nostra intuizione di come funziona l'autoboxing può essere spesso errata.

2. Problema

Cominciamo con la definizione del problema. Abbiamo un array di primitive ( int [] ) e desideriamo convertirlo in un List ( List ). Un primo tentativo intuitivo potrebbe essere:

int[] input = new int[]{1,2,3,4}; List output = Arrays.asList(input);

Sfortunatamente, questo non verrà compilato a causa di incompatibilità di tipo . Potremmo aspettarci che l'autoboxing funzioni con array di primitive. Tuttavia, questa convinzione istintiva non è vera.

L'autoboxing avviene solo per un singolo elemento (ad esempio da int a Integer ). Non c'è conversione automatica da un array di tipi primitivi a un array dei loro tipi di riferimento boxed (ad esempio da int [] a Integer [] ).

Cominciamo a implementare alcune soluzioni a questo problema.

3. Iterazione

Poiché l'autoboxing funziona con singoli elementi primitivi, una soluzione semplice consiste nell'iterare semplicemente gli elementi dell'array e aggiungerli all'elenco uno per uno :

int[] input = new int[]{1,2,3,4}; List output = new ArrayList(); for (int value : input) { output.add(value); }

Abbiamo risolto il problema, ma la soluzione è piuttosto prolissa. Questo ci porta alla prossima implementazione.

4. Stream

A partire da Java 8, possiamo utilizzare l' API Stream . Possiamo fornire una soluzione su una riga utilizzando uno Stream :

int[] input = new int[]{1,2,3,4}; List output = Arrays.stream(input).boxed().collect(Collectors.toList());

In alternativa, potremmo usare IntStream :

int[] input = new int[]{1,2,3,4}; List output = IntStream.of(input).boxed().collect(Collectors.toList());

Questo sembra sicuramente molto più carino. Successivamente, esamineremo un paio di librerie esterne.

5. Guava

La libreria Guava fornisce un wrapper per questo problema . Cominciamo aggiungendo la dipendenza Maven:

 com.google.guava guava 29.0-jre bundle 

Possiamo usare Ints.asList () , con classi di utilità simili per gli altri tipi primitivi:

int[] input = new int[]{1,2,3,4}; List output = Ints.asList(input);

6. Apache Commons

Un'altra libreria è Apache Commons Lang. Ancora una volta, aggiungiamo la dipendenza Maven per questa libreria:

 org.apache.commons commons-lang3 3.10 

Più precisamente, usiamo la classe ArrayUtils :

int[] input = new int[]{1,2,3,4}; Integer[] outputBoxed = ArrayUtils.toObject(input); List output = Arrays.asList(outputBoxed);

7. Conclusione

Ora abbiamo alcune opzioni nella nostra casella degli strumenti per convertire un array di primitive in un elenco . Come abbiamo visto, l'autoboxing avviene solo per i singoli elementi. In questo tutorial, abbiamo visto diverse soluzioni per applicare la conversione .

Come sempre, il codice sorgente completo dell'articolo è disponibile su GitHub.