v tomto příspěvku budeme diskutovat o různých metodách inicializace seznamu v Javě v jednom řádku.
Java je často kritizována za svou výmluvnost.,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.,přidat („C“);
seznam.přidat („c++“);
seznam.přidat („Java“);
list = Collections.unmodifiableList(seznam);
|
V tomto příspěvku, budeme diskutovat o různé způsoby inicializace seznamu v jediném výrazu.
pole.asList ()
Arrays.asList()
vrací seznam pevných velikostí podporovaný zadaným polem. Vzhledem k tomu, že pole nelze strukturálně upravit, není možné přidávat prvky do seznamu nebo z něj odstraňovat prvky., 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 Sbírky
Kolekce třídy se skládá z několika statických metod, které působí na sbírkách a vrátí novou kolekci opírající se o uvedené sbírky.
⮚ sbírky.addAll ()
Collections.addAll()
přidá všechny zadané prvky do zadané kolekce. Prvky, které mají být přidány, mohou být specifikovány jednotlivě nebo jako pole., 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(seznam = new ArrayList<String>(), „C“, „C++“, „Java“);
|
⮚ Sbírky.unmodifiableList ()
alternativně lze naplnit sbírku pomocí konstruktoru kopií z jiné sbírky. Jednou z takových metod je Collections.unmodifiableList()
vrací nemodifikovatelný pohled na zadaný seznam. Jakékoli pokusy o změnu vráceného seznamu budou mít za následek UnsupportedOperationException
.
⮚ sbírky.,singletonList()
chceme-Li Seznam obsahující pouze jeden prvek, můžeme použít Collections.singletonList()
, která vrací neměnný seznam obsahující tento prvek. Seznam bude hodit UnsupportedOperationException
pokud je na něm provedena nějaká operace úpravy.
1
|
Seznam<String> seznam = Sbírky.,singletonList(„Java“);
|
Double Výztuhou Inicializace
Další alternativou je použití „Double Výztuhou Inicializace“. Tím se vytvoří anonymní vnitřní třída s pouhým inicializátorem instance. Tato technika by se měla nejlépe vyhnout, protože při každém použití stojí další třídu a také obsahuje skryté odkazy na uzavírací instanci a na všechny zachycené objekty. To může způsobit úniky paměti nebo problémy se serializací.,v>2
Java 8
Java 8 Stream API mohou být použity k vytvoření malé seznamy získání proudu od statické tovární metody a hromadí vstupní prvky do nového seznamu pomocí kolektorů., 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.,z („C“,“ C++“,“ Java“)
.sbírat (sběratelé.toCollection (ArrayList::new));
|
Collectors kolektory.collectingAndThen ()
Mohli bychom přizpůsobit kolektor provést další dokončovací transformaci., Například, můžeme přizpůsobit toList()
kolektoru, aby se vždy produkovat zakázaný seznam se:
Java 9
Java 9 bylo výhodné vytvořit instance seznamu s malým počtem prvků, tím, že poskytuje Lists.of()
statické tovární metody, která vytváří kompaktní, zakázaný instancí., 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., Nyní je zřejmá otázka, proč Java 9 zahrnoval tolik dalších metod, kdy stačí pouze var-args? Důvodem je, že je tu jemná runtime výkonnostní výhoda. Verze var-args bude pravděpodobně běžet pomaleji než přetížení, které nepoužívají varargs. Je to proto, že každé vyvolání metody varargs způsobí alokaci a inicializaci pole a nezapomíná na režii GC.
podle Javadoc mají instance seznamu vytvořené List.of()
následující vlastnosti:
- jsou strukturálně neměnné., Prvky nelze přidávat, odstraňovat ani vyměňovat. Volání jakékoli metody mutátoru vždy způsobí, že
UnsupportedOperationException
bude hodeno. Pokud jsou však obsažené prvky samy o sobě proměnlivé, může to způsobit změnu obsahu seznamu. - zakazují nulové prvky. Pokusy o jejich vytvoření s nulovými prvky vedou k
NullPointerException
. - jsou serializovatelné, pokud jsou všechny prvky serializovatelné.
- pořadí prvků v seznamu je stejné jako pořadí, předložil argumenty, nebo prvky v poskytovaných pole.,
- jsou založeny na hodnotě. Volající by neměli dělat žádné předpoklady o totožnosti vrácených instancí. Továrny mohou vytvářet nové instance nebo znovu používat stávající. Operace citlivé na identitu v těchto případech (referenční rovnost ( = = ), hash kód identity a synchronizace) jsou proto nespolehlivé a je třeba se jim vyhnout.,
If we need a List that can expand or shrink, we can use –
1
|
List<String> list = new ArrayList<>(List.,(„C“, „C++“, „Java“));
|
vezměte Prosím na vědomí, že na rozdíl od statické metody třídy, statické metody v rozhraní nejsou dědičné, takže je nebude možné uplatnit prostřednictvím prováděcích třídy, ani prostřednictvím instance rozhraní typ.
Guava
Guava také poskytuje několik statických užitných metod týkajících se instancí seznamu.,
Inicializovat Seznamu pomocí Guava v Javě
Apache Commons Collections
Apache Commons Collections ListUtils
třída poskytuje unmodifiableList()
, která vrací zakázaný seznam opírající se o daném seznamu. Hodí NullPointerException
pokud je daný seznam null a UnsupportedOperationException
pokud je na něm provedena nějaká operace úpravy.