I dette innlegget vil vi diskutere ulike metoder for å initialisere liste i Java i en enkelt linje.
Java er ofte kritisert for sin detaljnivå.,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.,legge til(«C»);
liste.legge til(«C++»);
liste.legge til(«Java»);
liste = Samlinger.unmodifiableList(liste);
|
I dette innlegget vil vi diskutere ulike metoder for å initialisere liste i et enkelt uttrykk.
– Matriser.asList()
Arrays.asList()
returnerer en fast størrelse liste støttet av den angitte tabellen. Siden en matrise kan ikke være strukturelt endres, det er ikke mulig å legge til elementer i listen eller fjerne elementer fra den., 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 Samlinger
Samlinger klasse består av flere statiske metoder som opererer på samlinger og returnere en ny samling støttet av en bestemt samling.
⮚ Samlinger.addAll()
Collections.addAll()
legger til alle de angitte elementene til den angitte samling. Elementer som skal legges kan spesifiseres enkeltvis eller som en matrise., 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(liste = new ArrayList<String>(), «C», «C++», «Java»);
|
⮚ Samlinger.unmodifiableList()
Alternativt, kan man fylle ut en samling med en kopi constructor fra en annen samling. En slik metode er Collections.unmodifiableList()
returnerer en unmodifiable utsikt over den angitte listen. Eventuelle forsøk på å endre den tilbake listen vil resultere i en UnsupportedOperationException
.
⮚ Samlinger.,singletonList()
Hvis vi vil ha en Liste som bare inneholder en enkelt element, kan vi bruke Collections.singletonList()
som returnerer en uforanderlig liste som inneholder elementet. Listen vil kaste en UnsupportedOperationException
hvis noen vil endre utføres operasjonen på den.
1
|
Listen<String> liste = Samlinger.,singletonList(«Java»);
|
Dobbel Spenne Initialisering
et Annet alternativ er å bruke «Dobbelt Spenne Initialisering». Dette skaper en anonym indre klasse med bare en forekomst initializer i det. Denne teknikken bør være best unngås som det koster en ekstra klasse på hver bruk og den holder også skjulte referanser til det aktuelle tilfellet og til alle fanget objekter. Dette kan føre til minne lekkasjer eller problemer med bedriften.,v>2
Java 8
Java 8 Stream API kan brukes til å lage små lister ved å streame fra statisk fabrikken metoder og samler innspill elementer i en ny liste ved hjelp av samlere., 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.,av(«C», «C++», «Java»)
.samle(Samlere.toCollection(ArrayList::ny));
|
⮚ Samlere.collectingAndThen()
Vi kan tilpasse en Samler til å utføre en ekstra etterbehandling transformasjon., For eksempel, vi kan tilpasse toList()
collector å alltid produsere en unmodifiable liste med:
Java 9
Java-9 gjorde det praktisk å opprette forekomster av listen med små antall av elementer ved å gi Lists.of()
statisk fabrikken metoder som skaper kompakte, unmodifiable forekomster av det., 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., Nå er det åpenbare spørsmålet er hvorfor Java-9 har inkludert så mange ekstra metoder når det bare var-args kan være nok? Grunnen er at det er en subtil runtime ytelse fordel. Det var-args versjonen er sannsynlig å kjøre saktere enn overloadings som ikke bruker varargs. Dette er fordi hver gang en varargs metoden vil føre til en rekke tildeling og initialisering og for ikke å glemme GC overhead.
Som per Javadoc, Listen tilfeller opprettet av List.of()
har følgende egenskaper:
- De er strukturelt uforanderlig., Elementer kan legges til, fjernes eller erstattes. Å kalle noen mutator metode vil alltid føre til
UnsupportedOperationException
for å bli kastet. Imidlertid, hvis den inneholdt elementer er i seg selv kan endres, kan dette føre til Listen innholdet skal vises for å endre. - De disallow null-elementer. Forsøk på å lage dem med null elementer resultere i
NullPointerException
. - De er serialiserbare hvis alle elementene er serialiserbare.
- rekkefølgen av elementene i listen er den samme som rekkefølgen av argumenter, eller elementer i den vedlagte tabellen.,
- De er verdi-basert. Innringere bør gjøre noen forutsetninger om identiteten til den tilbake tilfeller. Fabrikker er gratis å opprette nye forekomster eller gjenbruk av eksisterende. Derfor, identitet-sensitive operasjoner på disse tilfeller (referanse likestilling (==), identitet hash-koden, og synkronisering) er upålitelige, og bør unngås.,
If we need a List that can expand or shrink, we can use –
1
|
List<String> list = new ArrayList<>(List.,av(«C», «C++», «Java»));
|
Vennligst merk at i motsetning til statiske metoder på klasser, statiske metoder på grensesnitt er ikke arvelig, så det vil ikke være mulig å påberope seg dem via en implementering av klasse, eller via en forekomst av grensesnitt-type.
Guava
Guava gir også flere statiske metoder verktøy knyttet til Liste tilfeller.,
Initialisere Listen ved hjelp av Guava i Java –
– >
Apache Commons Samlinger
Apache Commons Samlinger ListUtils
klasse gir unmodifiableList()
som returnerer en unmodifiable liste støttet av den gitte listen. Det kaster en NullPointerException
hvis den gitte listen er null og en UnsupportedOperationException
hvis noen vil endre utføres operasjonen på den.