w tym poście omówimy różne metody inicjalizacji list in Java in a single line.
Java jest często krytykowana za jej słowność.,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.,add („C”);
list.add („C++”);
list.add („Java”);
list = Collections.unmodifiableList (list);
|
w tym poście omówimy różne metody inicjalizacji listy w jednym wyrażeniu.
Tablice.asList()
Arrays.asList()
zwraca listę o stałym rozmiarze wspieraną przez podaną tablicę. Ponieważ tablica nie może być strukturalnie modyfikowana, nie można dodawać elementów do listy ani usuwać z niej elementów., 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”));
|
Kolekcje Javy
Klasa Collections składa się z kilku statycznych metod, które działają na kolekcjach i zwracają nową kolekcję wspieraną przez określoną kolekcję.
addAll()
Collections.addAll()
dodaje wszystkie określone elementy do określonej kolekcji. Dodawane elementy mogą być określone pojedynczo lub jako tablica., 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”);
|
collections kolekcje.unmodifiableList ()
Alternatywnie, można wypełnić kolekcję za pomocą konstruktora kopiującego z innej kolekcji. Jedną z takich metod jest Collections.unmodifiableList()
zwraca niezmodyfikowany widok podanej listy. Wszelkie próby modyfikacji zwracanej listy spowodują UnsupportedOperationException
.
,singletonList()
jeśli chcemy mieć listę zawierającą tylko jeden element, możemy użyć Collections.singletonList()
, która zwraca niezmienną listę zawierającą ten element. Lista wyświetli UnsupportedOperationException
jeśli na niej zostanie wykonana jakaś operacja modyfikacji.
1
|
list<string> list = collections.,singletonList („Java”);
|
Inicjalizacja podwójnego nawiasu klamrowego
inną alternatywą jest użycie”inicjalizacji podwójnego nawiasu klamrowego”. Tworzy to anonimową klasę wewnętrzną z tylko inicjalizatorem instancji. Technika ta powinna być najlepiej unikać, ponieważ kosztuje dodatkową klasę przy każdym użyciu, a także zawiera ukryte odniesienia do instancji otaczającej i do przechwyconych obiektów. Może to spowodować wycieki pamięci lub problemy z serializacją.,v>2
Java 8
Java 8 stream API może być używane do konstruowania małych list poprzez uzyskiwanie strumienia ze statycznych metod fabrycznych i gromadzenie elementów wejściowych do nowej listy za pomocą kolektorów., 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”)
.collect(kolekcjoner.toCollection (ArrayList::new));
|
collectingAndThen()
możemy dostosować kolektor do wykonania dodatkowej transformacji wykończeniowej., Na przykład, możemy dostosować kolektor toList()
tak, aby zawsze tworzyć niezmodyfikowaną listę za pomocą:
Java 9
Java 9 ułatwiała tworzenie instancji listy z małą liczbą elementów, dostarczając statyczne metody fabryczne Lists.of()
, które tworzą zwarte, niezmodyfikowane jej instancje., 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., Teraz oczywiste pytanie brzmi, dlaczego Java 9 zawiera tak wiele dodatkowych metod, skoro wystarczą tylko var-args? Powodem jest subtelna zaleta wydajności pracy. Wersja var-args prawdopodobnie będzie działać wolniej niż przeciążenia, które nie używają varargs. Dzieje się tak dlatego, że każde wywołanie metody varargs spowoduje alokację i inicjalizację tablicy i nie zapomni o nagłówkach GC.
zgodnie z Javadoc, instancje listy utworzone przez List.of()
mają następujące cechy:
- są strukturalnie niezmienne., Elementów nie można dodawać, usuwać ani zastępować. Wywołanie dowolnej metody mutatora zawsze spowoduje wyrzucenie
UnsupportedOperationException
. Jednakże, jeśli elementy są zmienne, może to spowodować zmianę zawartości listy. - wykluczają elementy null. Próby utworzenia ich z elementami null skutkują
NullPointerException
. - są serializowalne, jeśli wszystkie elementy są serializowalne.
- kolejność elementów na liście jest taka sama jak kolejność podanych argumentów lub elementów w podanej tablicy.,
- są oparte na wartościach. Osoby wywołujące nie powinny zakładać tożsamości zwracanych instancji. Fabryki mogą tworzyć nowe instancje lub ponownie wykorzystywać istniejące. W związku z tym operacje wrażliwe na tożsamość na tych instancjach (równość odniesienia (==), kod skrótu tożsamości i synchronizacja) są zawodne i należy ich unikać.,
If we need a List that can expand or shrink, we can use –
1
|
List<String> list = new ArrayList<>(List.,of („C”, „C++”, „Java”));
|
należy pamiętać, że w przeciwieństwie do metod statycznych na klasach, metody statyczne na interfejsach nie są dziedziczone, więc nie będzie możliwe wywołanie ich przez klasę implementującą, ani przez instancję typu interfejsu.
Guava
Guava udostępnia również kilka statycznych metod użytkowych odnoszących się do wystąpień listy.,
Inicjalizacja listy za pomocą Guava w języku Java
Kolekcje Apache Commons
Kolekcje Apache Commons ListUtils
zapewnia klasę unmodifiableList()
który zwraca niezmodyfikowaną listę wspieraną przez podaną listę. Rzuca NullPointerException
jeśli podana lista jest null i UnsupportedOperationException
jeśli na niej zostanie wykonana jakaś operacja modyfikacji.