In dit bericht zullen we verschillende methoden bespreken om lijst in Java in een enkele regel te initialiseren.
Java wordt vaak bekritiseerd vanwege zijn breedsprakigheid.,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.,toevoegen(“C”);
lijst.toevoegen(“C++”);
lijst.add (“Java”);
list = collecties.unmodifiableList (list);
|
In dit bericht zullen we verschillende methoden bespreken om de lijst in een enkele expressie te initialiseren.
Arrays.asList ()
Arrays.asList()
geeft een lijst met vaste grootte terug die wordt ondersteund door de opgegeven array. Omdat een array niet structureel kan worden gewijzigd, is het niet mogelijk om elementen aan de lijst toe te voegen of er elementen uit te verwijderen., 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 collecties
Collecties de klasse bestaat uit verschillende statische methoden die werken op collecties en een nieuwe collectie retourneren die wordt ondersteund door een specifieke collectie.
Collections Verzamelingen.addAll ()
Collections.addAll()
voegt alle gespecificeerde elementen toe aan de opgegeven verzameling. Elementen die moeten worden toegevoegd, kunnen afzonderlijk of als array worden gespecificeerd., 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”);
|
⮚ collecties.unmodifiableList ()
als alternatief kan men een verzameling bevolken met behulp van een copy constructor uit een andere verzameling. Een van deze methoden is Collections.unmodifiableList()
geeft een niet-aanpasbare weergave van de opgegeven lijst terug. Elke poging om de geretourneerde lijst te wijzigen zal resulteren in een UnsupportedOperationException
.
Collections Verzamelingen.,singletonList ()
als we een lijst willen die slechts één element bevat, kunnen we Collections.singletonList()
gebruiken die een onveranderlijke lijst retourneert die dat element bevat. De lijst zal een UnsupportedOperationException
gooien als er een modificatiebewerking op wordt uitgevoerd.
1
|
Lijst<String> lijst = Collecties.,singletonList (“Java”);
|
Double Brace Initialization
een ander alternatief is het gebruik van”Double Brace Initialization”. Dit creëert een anonieme innerlijke klasse met slechts een instantie initializer erin. Deze techniek moet het beste vermeden worden omdat het een extra klasse kost bij elk gebruik en het bevat ook verborgen verwijzingen naar de omsluitende instantie en naar alle gevangen objecten. Dit kan geheugenlekken of problemen met serialisatie veroorzaken.,v>2
Java-8
De Java 8 Stream API kan worden gebruikt voor het bouwen van kleine lijsten door het verkrijgen van stroom van een statische fabriek methoden en het verzamelen van de input-elementen in een nieuwe lijst met verzamelaars., 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.,of (“C”,” C++”,” Java”)
.verzamelen (verzamelaars.toCollection (ArrayList::new));
|
⮚ Collectors.collectingAndThen ()
We kunnen een Collector aanpassen om een extra afwerking transformatie uit te voeren., We kunnen bijvoorbeeld de toList()
collector aanpassen om altijd een niet-aanpasbare lijst te produceren met:
Java 9
Java 9 maakte het handig om instanties van Lijst met kleine aantallen elementen te maken door Lists.of()
statische fabrieksmethoden aan te bieden die compacte, niet-aanpasbare instanties ervan maken., 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., Nu is de voor de hand liggende vraag waarom Java 9 zoveel extra methoden heeft opgenomen terwijl alleen var-args kan volstaan? De reden is dat er een subtiel runtime prestatievoordeel is. De var-args versie zal waarschijnlijk langzamer werken dan de overloadings die geen varargs gebruiken. Dit komt omdat elke aanroep van een varargs methode een array allocatie en initialisatie zal veroorzaken en niet te vergeten GC overhead.
Volgens Javadoc hebben de door List.of()
aangemaakt lijstinstances de volgende kenmerken:
- ze zijn structureel onveranderlijk., Elementen kunnen niet worden toegevoegd, verwijderd of vervangen. Het aanroepen van een mutator methode zal er altijd voor zorgen dat
UnsupportedOperationException
wordt gegooid. Echter, als de elementen zelf veranderlijk zijn, kan dit ertoe leiden dat de inhoud van de lijst lijkt te veranderen. - ze staan null-elementen niet toe. Pogingen om ze aan te maken met null-elementen resulteren in
NullPointerException
. - ze zijn serialiseerbaar als alle elementen serialiseerbaar zijn.
- de volgorde van de elementen in de lijst is dezelfde als de volgorde van de gegeven argumenten, of van de elementen in de gegeven array.,
- ze zijn op waarde gebaseerd. Bellers mogen geen veronderstellingen maken over de identiteit van de geretourneerde instanties. Fabrieken zijn vrij om nieuwe instanties te creëren of bestaande te hergebruiken. Daarom zijn identiteits-gevoelige operaties op deze instanties (referentie gelijkheid ( = = ), identiteit hash code, en synchronisatie) onbetrouwbaar en moeten worden vermeden.,
If we need a List that can expand or shrink, we can use –
1
|
List<String> list = new ArrayList<>(List.,of (“C”, “C++”,”Java”));
|
houd er rekening mee dat in tegenstelling tot statische methoden op klassen, statische methoden op interfaces niet worden overgenomen, dus het zal niet mogelijk zijn om ze aan te roepen via een implementerende klasse, noch via een instantie van het interfacetype.
guave
guave biedt ook verschillende statische hulpprogramma methoden met betrekking tot de lijst instanties.,
Initialiseer Lijst met guave in Java
Apache Commons collecties
Apache Commons collecties ListUtils
class provides unmodifiableList()
dat een niet te wijzigen lijst ondersteund door de gegeven lijst. Het gooit een NullPointerException
als de gegeven lijst null is en een UnsupportedOperationException
als er een modificatiebewerking op wordt uitgevoerd.