Initialize List in Java in a Single Line (Polski)

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

3
4
5
List<String> lista = new ArrayList<string>() {{
add(„c”);
add(„C++”);
add(„Java”);
}};

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:

  1. 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.
  2. wykluczają elementy null. Próby utworzenia ich z elementami null skutkują NullPointerException.
  3. są serializowalne, jeśli wszystkie elementy są serializowalne.
  4. kolejność elementów na liście jest taka sama jak kolejność podanych argumentów lub elementów w podanej tablicy.,
  5. 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.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *