In questo post, discuteremo vari metodi per inizializzare list in Java in una singola riga.
Java è spesso criticato per la sua verbosità.,structing it, storing it in a variable, invoking add()
method on it n times, and then maybe wrapping it to make it unmodifiable:
1
2
3
4
5
6
7
|
List<String> list = new ArrayList<>();
list.,aggiungi (“C”);
elenco.aggiungi (“C++”);
elenco.aggiungi (“Java”);
list = Collezioni.unmodifiableList (list);
|
In questo post, discuteremo vari metodi per inizializzare list in una singola espressione.
Array.asList ()
Arrays.asList()
restituisce un elenco di dimensioni fisse supportato dall’array specificato. Poiché un array non può essere modificato strutturalmente, non è possibile aggiungere elementi all’elenco o rimuovere elementi da esso., The list will throw an UnsupportedOperationException
if any resize operation is performed on it.
1
|
List<String> fixedLengthList = Arrays.,asList(“C”, “C++”, “Java”);
|
If we need a List that can expand or shrink, we can use –
1
|
List<String> list = new ArrayList<>(Arrays.,asList(“C”, “C++”, “Java”));
|
Java Collections
La classe Collections è costituita da diversi metodi statici che operano su collections e restituiscono una nuova raccolta supportata da una raccolta specificata.
Collections Collezioni.addAll()
Collections.addAll()
aggiunge tutti gli elementi specificati alla raccolta specificata. Gli elementi da aggiungere possono essere specificati singolarmente o come array., When elements are specified individually, this method provides a convenient way to add a few elements to an existing collection:
1
2
|
List<String> list = Collections.EMPTY_LIST;
Collections.,addAll(lista = new ArrayList<String>(), “C”, “C++”, “Java”);
|
⮚ Collezioni.unmodifiableList ()
In alternativa, si può popolare una raccolta utilizzando un costruttore di copia da un’altra raccolta. Uno di questi metodi èCollections.unmodifiableList()
restituisce una vista non modificabile dell’elenco specificato. Qualsiasi tentativo di modificare l’elenco restituito comporterà un UnsupportedOperationException
.
Collections Collezioni.,singletonList()
Se vogliamo una lista contenente solo un singolo elemento, possiamo usare Collections.singletonList()
che restituisce una lista immutabile contenente quell’elemento. L’elenco genererà unUnsupportedOperationException
se viene eseguita un’operazione di modifica su di esso.
1
|
Elenco<String> elenco = Collezioni.,singletonList (“Java”);
|
Inizializzazione doppia parentesi
Un’altra alternativa è usare”Inizializzazione doppia parentesi”. Questo crea una classe interna anonima con solo un inizializzatore di istanze. Questa tecnica dovrebbe essere meglio evitata in quanto costa una classe extra ad ogni utilizzo e contiene anche riferimenti nascosti all’istanza che racchiude e a qualsiasi oggetto catturato. Ciò potrebbe causare perdite di memoria o problemi con la serializzazione.,v>2
Java 8
Java 8 Flusso di API può essere usato per costruire piccole liste, mediante l’ottenimento di flusso statico di fabbrica metodi e accumulando gli elementi di input in un nuovo elenco utilizzando i collezionisti., For example,
⮚ Collectors.toList()
Collectors.toList()
returns a Collector that accumulates the input elements into a new List.
1
2
|
List<String> list = Stream.of(“C”, “C++”, “Java”)
.collect(Collectors.toList());
|
⮚ Collectors.,toCollection()
The streams collectors make no guarantee on the type of the List
returned by toList()
. To ensure the returned List
is ArrayList
, we can use toCollection(Supplier)
as shown below:
1
2
|
List<String> list = Stream.,di (“C”, ” C++”, “Java”)
.raccogliere (Collezionisti.toCollection (ArrayList:: new));
|
Collectors Collectors.collectingAndThen ()
Potremmo adattare un Collector per eseguire un’ulteriore trasformazione di finitura., Ad esempio, potremmo adattare il toList()
collector per produrre sempre un elenco non modificabile con:
Java 9
Java 9 ha reso conveniente creare istanze di list con un piccolo numero di elementi fornendo Lists.of()
metodi di fabbrica statici che ne creano istanze compatte e non modificabili., For example,
1
|
List<String> unmodifiableList = List.of(“C”, “C++”, “Java”);
|
Java 9 provides 12 overloaded versions of this method –
Note there is a var-args version which can handle any number of elements., Ora la domanda ovvia è perché Java 9 ha incluso così tanti metodi extra quando solo var-args può essere sufficiente? Il motivo è che c’è un sottile vantaggio in termini di prestazioni di runtime. È probabile che la versione var-args funzioni più lentamente degli overloading che non utilizzano varargs. Questo perché ogni invocazione di un metodo varargs causerà un’allocazione e un’inizializzazione dell’array e non dimenticare l’overhead di GC.
Come da Javadoc, le istanze di elenco create daList.of()
hanno le seguenti caratteristiche:
- Sono strutturalmente immutabili., Gli elementi non possono essere aggiunti, rimossi o sostituiti. Chiamare qualsiasi metodo mutatore causerà sempre il lancio di
UnsupportedOperationException
. Tuttavia, se gli elementi contenuti sono essi stessi mutabili, ciò potrebbe causare la modifica del contenuto dell’elenco. - Non consentono elementi null. I tentativi di crearli con elementi null risultano in
NullPointerException
. - Sono serializzabili se tutti gli elementi sono serializzabili.
- L’ordine degli elementi nell’elenco è lo stesso dell’ordine degli argomenti forniti o degli elementi nell’array fornito.,
- Sono basati sul valore. I chiamanti non dovrebbero fare ipotesi sull’identità delle istanze restituite. Le fabbriche sono libere di creare nuove istanze o riutilizzare quelle esistenti. Pertanto, le operazioni sensibili all’identità su queste istanze (uguaglianza di riferimento ( = = ), codice hash dell’identità e sincronizzazione) sono inaffidabili e dovrebbero essere evitate.,
If we need a List that can expand or shrink, we can use –
1
|
List<String> list = new ArrayList<>(List.,of(“C”, “C++”, “Java”));
|
Si noti che a differenza dei metodi statici sulle classi, i metodi statici sulle interfacce non sono ereditati, quindi non sarà possibile invocarli tramite una classe di implementazione, né tramite un’istanza del tipo di interfaccia.
Guava
Guava fornisce anche diversi metodi di utilità statici relativi alle istanze List.,
Inizializza l’elenco usando Guava in Java
Apache Commons Collections
Apache Commons Collections ListUtils
la classe fornisce unmodifiableList()
che restituisce un elenco non modificabile supportato dall’elenco specificato. Genera unNullPointerException
se la lista data è null e unUnsupportedOperationException
se viene eseguita qualsiasi operazione di modifica su di esso.