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: Ebben a részletben: Ha nem érdekelne a pontos Lista típusú, leegyszerűsíthetjük: 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. 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: 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: 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. 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: Ebben a korábbi oktatóanyagban további részleteket találhatunk a folyamok rendezéséről. 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.ArrayList newList = srcCollection.stream (). Collect (toCollection (ArrayList :: new));
List newList = srcCollection.stream (). Collect (toList ());
5. Mély másolat
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); }}
ArrayList newList = srcCollection.stream () .map (foo -> foo.deepCopy ()) .collect (toCollection (ArrayList :: new));
6. A lista sorrendjének ellenőrzése
ArrayList newList = srcCollection.stream () .sorted (Comparator.comparing (Foo :: getName)) .collect (toCollection (ArrayList :: new));
7. Következtetés