Prevod kolekcie na ArrayList v Jave

1. Prehľad

Konverzia zbierok Java z jedného typu na druhý je bežnou programovacou úlohou. V tomto tutoriáli prevedieme akýkoľvek typ Zbierka do an ArrayList.

V celom tutoriále budeme predpokladať, že už máme zbierku Foo predmety. Odtiaľ vytvoríme ArrayList pomocou rôznych prístupov.

2. Definovanie nášho príkladu

Ale predtým, ako budeme pokračovať, poďme modelovať náš vstup a výstup.

Našim zdrojom môže byť akýkoľvek typ zbierky, takže ju deklarujeme pomocou Zbierka rozhranie:

Zbierka srcCollection; 

Musíme vyrobiť ArrayList s rovnakým typom prvku:

ArrayList newList;

3. Používanie konštruktora ArrayList

Najjednoduchší spôsob kopírovania kolekcie do novej kolekcie je pomocou jej konštruktora.

V našom predchádzajúcom sprievodcovi zoznamom ArrayList sme sa dozvedeli, že ArrayList konštruktor môže prijať parameter kolekcie:

ArrayList newList = nový ArrayList (srcCollection);
  • Nové ArrayList obsahuje plytkú kópiu prvkov Foo v zdrojovej kolekcii.
  • Poradie je rovnaké ako v zdrojovej zbierke.

Jednoduchosť konštruktora z neho robí skvelú voľbu vo väčšine scenárov.

4. Používanie Streams API

Teraz, Poďme využiť výhody Streams API na vytvorenie zoznamu ArrayList z existujúcej zbierky:

ArrayList newList = srcCollection.stream (). Collect (toCollection (ArrayList :: new));

V tomto úryvku:

  • Berieme prúd zo zdrojovej zbierky a aplikujeme zbierať () operátor na vytvorenie a Zoznam
  • Upresňujeme ArrayList :: nový aby sme dostali požadovaný typ zoznamu
  • Tento kód tiež vytvorí plytkú kópiu.

Keby nás nezaujímal presný údaj Zoznam by sme mohli zjednodušiť:

Zoznam newList = srcCollection.stream (). Collect (toList ());

Poznač si to toCollection () a listovať() sú staticky importované z Zberatelia. Ak sa chcete dozvedieť viac, prečítajte si nášho sprievodcu zberateľmi Java 8.

5. Hlboká kópia

Predtým, ako sme spomenuli „plytké kópie“. Tým myslíme to prvky v novom zozname sú úplne rovnaké Foo inštancie ktoré stále existujú v zdrojovej zbierke. Preto sme skopírovali Foos do newList odkazom.

Ak upravíme obsah a Foo napríklad v ktorejkoľvek zbierke úprava sa prejaví v oboch zbierkach. Preto, ak chceme upraviť prvky v ktorejkoľvek kolekcii bez pri úprave druhého musíme vykonať „hlbokú kópiu“.

Ak chcete hlboko kopírovať a Foo, my vytvoriť úplne nový Foo inštancia pre každý prvok. V dôsledku toho všetky Foo polia je potrebné skopírovať do nových inštancií.

Definujme si svoje Foo triedy, aby vedela, ako sa má hlboko kopírovať:

public class Foo {private int id; súkromné ​​meno reťazca; súkromný rodič Foo; public Foo (int id, String name, Foo parent) {this.id = id; this.name = meno; this.parent = rodič; } public Foo deepCopy () {return new Foo (this.id, this.name, this.parent! = null? this.parent.deepCopy (): null); }}

Tu vidíme polia id a názov int a String. Tieto dátové typy sa kopírujú podľa hodnoty. Preto ich môžeme jednoducho priradiť.

The rodič pole je ďalšie Foo, čo je trieda. Ak Foo bol zmutovaný, každý kód, ktorý zdieľa tento odkaz, by bol týmito zmenami ovplyvnený. Musíme hlboko kopírovať rodič lúka.

Teraz sa môžeme vrátiť k našej ArrayList premena. Len potrebujeme mapa operátor vložiť hlbokú kópiu do toku:

ArrayList newList = srcCollection.stream () .map (foo -> foo.deepCopy ()) .collect (toCollection (ArrayList :: new));

Obsah jednej zbierky môžeme upraviť bez toho, aby sme ovplyvnili druhú.

Hlboká kópia môže byť zdĺhavý proces v závislosti od počtu prvkov a hĺbky údajov. Použitie paralelného toku tu môže v prípade potreby poskytnúť zvýšenie výkonu.

6. Ovládanie poradia zoznamu

Náš stream predvolene dodáva prvky nášmu ArrayList v rovnakom poradí, v akom sa vyskytujú v zdrojovej zbierke.

Ak chceme toto poradie zmeniť mohli by sme použiť zoradené () operátora do streamu. Na triedenie našich Foo objekty podľa názvu:

ArrayList newList = srcCollection.stream () .sorted (Comparator.comparing (Foo :: getName)) .collect (toCollection (ArrayList :: new));

V tomto staršom výučbe môžeme nájsť ďalšie podrobnosti o poradí streamov.

7. Záver

The ArrayList konštruktor je efektívny spôsob, ako získať obsah a Zbierka do nového ArrayList.

Ak však potrebujeme doladiť výsledný zoznam, rozhranie Streams API poskytuje účinný spôsob úpravy procesu.

Kód použitý v tomto článku nájdete celý na GitHub.


$config[zx-auto] not found$config[zx-overlay] not found