În acest post, vom discuta diverse metode de inițializare a listei în Java într-o singură linie.Java este adesea criticată pentru verbozitatea sa.,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.,adăugați („C”);
listă.adauga („c++”);
listă.adauga („Java”);
listă = colecții.unmodifiableList(lista);
|
În acest post, vom discuta despre diverse metode pentru a inițializa listă într-o singură expresie.
matrice.asList ()
Arrays.asList()
returnează o listă de dimensiuni fixe susținută de matrice specificat. Deoarece o matrice nu poate fi modificată structural, nu este posibil să adăugați elemente în listă sau să eliminați elemente din ea., 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 Colecții
Colecții de clasă este format din mai multe metode statice care operează pe colecții și să se întoarcă o nouă colecție susținută de o anumită colecție.
⮚ colecții.addAll()
Collections.addAll()
adaugă toate elementele specificate la colecția specificată. Elementele care urmează să fie adăugate pot fi specificate individual sau ca o matrice., 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(list = new ArrayList<String>(), „C”, „C++”, „Java”);
|
⮚ Colecții.unmodifiableList ()
alternativ, se poate popula o colecție folosind un constructor de copiere dintr-o altă colecție. O astfel de metodă este Collections.unmodifiableList()
returnează o vizualizare nemodificabilă a listei specificate. Orice încercare de modificare a listei returnate va avea ca rezultat un UnsupportedOperationException
.
⮚ colecții.,singletonList()
Dacă dorim o Listă care conține doar un singur element, putem folosi Collections.singletonList()
care returnează o lista imuabil care conțin acest element. Lista va arunca un UnsupportedOperationException
dacă se efectuează vreo operație de modificare.
1
|
Lista<String> list = Colecții.,o altă alternativă este de a utiliza „Double Brace Initialization”(inițializare Double Brace). Aceasta creează o clasă interioară anonimă cu doar un inițializator de instanță în ea. Această tehnică ar trebui evitată cel mai bine, deoarece costă o clasă suplimentară la fiecare utilizare și conține, de asemenea, referințe ascunse la instanța de închidere și la orice obiecte capturate. Acest lucru poate provoca scurgeri de memorie sau probleme cu serializarea.,v>2
3
4
5
|
Lista<String> list = new ArrayList<String>() {{
add(„C”);
add(„C++”);
add(„Java”);
}};
|
Java 8
Java 8 Stream API poate fi folosit pentru a construi liste mici de obținere flux de fabrica static metode și acumularea de elemente de intrare într-o nouă listă folosind colectoare., 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.,de („C”, „C++”, „Java”)
.colecta(colectori.toCollection(ArrayList::noi));
|
⮚ Colecționari.collectingAndThen ()
am putea adapta un colector pentru a efectua o transformare suplimentară de finisare., De exemplu, am putea adapta toList()
colector pentru a produce întotdeauna o unmodifiable lista cu:
Java 9
Java 9 a făcut convenabil pentru a crea cazuri de listă cu număr mic de elemente prin furnizarea Lists.of()
static fabrica de metode care creează compact, unmodifiable instanțe ale acesteia., 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., Acum, întrebarea evidentă este de ce Java 9 a inclus atât de multe metode suplimentare atunci când numai var-args pot fi suficiente? Motivul este că există un avantaj subtil de performanță în timpul rulării. Versiunea var-args este probabil să ruleze mai lent decât supraîncărcările care nu utilizează varargs. Acest lucru se datorează faptului că fiecare invocare a unei metode varargs va determina o alocare matrice și inițializare și să nu uităm GC deasupra capului.conform Javadoc, instanțele de listă create de List.of()
au următoarele caracteristici:
- ele sunt imuabile structural., Elementele nu pot fi adăugate, eliminate sau înlocuite. Apelarea oricărei metode de mutator va determina întotdeauna
UnsupportedOperationException
să fie aruncată. Cu toate acestea, dacă elementele conținute sunt ele însele mutabile, acest lucru poate determina modificarea conținutului listei. - ei nu permit elemente nule. Încercările de a le crea cu elemente nule au ca rezultat
NullPointerException
.ele sunt serializabile dacă toate elementele sunt serializabile. - ordinea elementelor din listă este aceeași cu ordinea argumentelor furnizate sau a elementelor din matricea furnizată.,
- ele sunt bazate pe valoare. Apelanții nu ar trebui să facă presupuneri cu privire la identitatea instanțelor returnate. Fabricile sunt libere să creeze instanțe noi sau să le reutilizeze pe cele existente. Prin urmare, operațiunile sensibile la identitate asupra acestor instanțe (egalitatea de referință ( = = ), codul hash de identitate și sincronizarea) nu sunt fiabile și ar trebui evitate.,
If we need a List that can expand or shrink, we can use –
1
|
List<String> list = new ArrayList<>(List.,de(„C”, „C++”, „Java”));
|
vă Rugăm să rețineți că, spre deosebire de metodele statice pe clase, metode statice pe interfețele nu sunt moștenite, astfel că nu va fi posibil să le invoce printr-o punere în aplicare de clasă, nici printr-un exemplu de tipul de interfata.
Guava
Guava oferă, de asemenea, mai multe metode de utilitate statice referitoare la instanțe listă.,
Inițializare Listă folosind Guava în Java
Apache Commons Colecții
Apache Commons Colecții ListUtils
class oferă unmodifiableList()
care returnează un unmodifiable lista susținută de lista dată. Acesta aruncă un NullPointerException
dacă lista dată este nulă și un UnsupportedOperationException
dacă se efectuează o operație de modificare.