Gyűjtemény konvertálása ArrayList-re Java-ban

1. Áttekintés

A Java gyűjtemények konvertálása egyik típusból a másikba általános programozási feladat. Ebben az oktatóanyagban bármilyen típusú konvertálunk Gyűjtemény egy Tömb lista.

Az oktatóanyag során feltételezzük, hogy már van egy gyűjteményünk Foo tárgyakat. Innen létrehozunk egy Tömb lista különféle megközelítések alkalmazásával.

2. Példánk meghatározása

De a folytatás előtt modellezzük a bemenetünket és a kimenetünket.

Forrásunk bármilyen típusú gyűjtemény lehet, ezért a Gyűjtemény felület:

Gyűjtemény srcCollection; 

Le kell gyártanunk egy Tömb lista ugyanazzal az elem típussal:

ArrayList newList;

3. Az ArrayList Constructor használata

A gyűjtemény másolásának legegyszerűbb módja egy új gyűjteményre a konstruktora.

Az ArrayList előző útmutatójában megtudtuk, hogy a Tömb lista A konstruktor elfogadhat egy gyűjteményparamétert:

ArrayList newList = új ArrayList (srcCollection);
  • Az új Tömb lista a forrásgyűjteményben található Foo elemek sekély példányát tartalmazza.
  • A sorrend megegyezik a forrásgyűjteményben szereplővel.

A kivitelező egyszerűsége miatt a legtöbb esetben nagyszerű lehetőség.

4. A Streams API használata

Most, használjuk ki a Streams API előnyeit egy ArrayList létrehozására egy meglévő gyűjteményből:

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

Ebben a részletben:

  • A forrást a forrásgyűjteményből vesszük, és alkalmazzuk a gyűjt() operátor létrehozni a Lista
  • Meghatározzuk ArrayList :: új hogy megkapjuk a kívánt listatípust
  • Ez a kód sekély másolatot is készít.

Ha nem érdekelne a pontos Lista típusú, leegyszerűsíthetjük:

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

Vegye figyelembe, hogy toCollection () és toList () statikusan importálva innen: Gyűjtők. Ha többet szeretne megtudni, olvassa el a Java 8 gyűjtőinek útmutatóját.

5. Mély másolat

Mielőtt megemlítettük volna a „sekély példányokat”. Ezzel azt értjük az új lista elemei pontosan megegyeznek Foo példányok amelyek még mindig léteznek a forrásgyűjteményben. Ezért lemásoltuk a Foos a newList referencia alapján.

Ha módosítjuk a tartalmát Foo például mindkét gyűjteményben, hogy a módosítás mindkét gyűjteményben megjelenik. Ezért, ha bármelyik elemet módosítani akarjuk nélkül a másik módosításához „mély másolatot” kell végrehajtanunk.

A mély másoláshoz a Foo, mi hozzon létre egy teljesen újat Foo példány minden elemhez. Következésképpen az összes Foo a mezőket át kell másolni az új példányokba.

Határozzuk meg a sajátunkat Foo osztály, hogy tudja, hogyan kell mélyre másolni magát:

nyilvános osztály Foo {private int id; privát karakterlánc neve; magán Foo szülő; public Foo (int id, karakterlánc neve, Foo szülő) {this.id = id; ez.név = név; ez.szülő = szülő; } public Foo deepCopy () {return new Foo (this.id, this.name, this.parent! = null? this.parent.deepCopy (): null); }}

Itt láthatjuk a mezőket id és név vannak int és Húr. Ezeket az adattípusokat érték szerint másoljuk. Ezért egyszerűen kijelölhetjük mindkettőt.

A szülő mező egy másik Foo, ami egy osztály. Ha Foo mutációt kapott, minden olyan kódot, amely megosztja ezt a hivatkozást, befolyásolják ezek a változások. Mélyen át kell másolnunk a szülő terület.

Most visszatérhetünk a miénkhez Tömb lista átalakítás. Csak szükségünk van a térkép operátorral helyezze be a mély másolatot az áramlásba:

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

Bármelyik gyűjtemény tartalmát módosíthatjuk anélkül, hogy befolyásolnánk a másikat.

A mély másolat hosszú folyamat lehet, az elemek számától és az adatok mélységétől függően. Párhuzamos adatfolyam használata itt teljesítménynövelést eredményezhet, ha szükséges.

6. A lista sorrendjének ellenőrzése

Alapértelmezés szerint az adatfolyamunk elemeket fog szállítani a mi oldalunkra Tömb lista ugyanabban a sorrendben, mint amellyel a forrásgyűjteményben találkozunk.

Ha meg akarjuk változtatni ezt a sorrendet alkalmazhatnánk a rendezve () üzemeltető a patakhoz. Válogatni a mi Foo tárgyak név szerint:

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

Ebben a korábbi oktatóanyagban további részleteket találhatunk a folyamok rendezéséről.

7. Következtetés

A Tömb lista A konstruktor hatékony módszer az a Gyűjtemény egy új Tömb lista.

Ha azonban módosítanunk kell az eredményül kapott listát, a Streams API hatékony módszert kínál a folyamat módosítására.

Az ebben a cikkben használt kód teljes egészében megtalálható a GitHubon.