Java - Több gyűjtemény kombinálása
1. Áttekintés
Ebben az oktatóanyagban bemutatjuk, hogyan lehet összefűzni több gyűjteményt egy logikai gyűjteménybe.
Öt különböző megközelítést fogunk feltárni - kettőt a Java 8-at, egyet a Guava-t, egyet az Apache Commons gyűjteményeket és egyet csak a szokásos Java 7 SDK-t használva.
A következő példákban vegyük figyelembe a következő gyűjteményeket:
GyűjteménygyűjteményA = Arrays.asList ("S", "T"); GyűjteménygyűjteményB = Arrays.asList ("U", "V");
2. A Java 8 használata Folyam API
A Folyam felület a Java API-ban hasznos módszereket kínál, amelyek megkönnyítik a gyűjtemények feldolgozását. Vessünk egy pillantást két módszerére - concat () és flatMap () - amelyeket a gyűjtemények kombinálásához használnak.
Miután megszerezte a Folyam, összesített műveleteket hajthat végre rajta.
2.1. Használni a concat () Módszer
A statikus módszer concat () kettőt egyesít Patakok logikusan egy lustán összefűzve Folyam amelynek elemei mind az első elemei Folyam amelyet a második összes eleme követ Folyam.
Az alábbi példában egyesítsük gyűjteményA és gyűjteményB használni a concat () módszer:
Stream combinedStream = Stream.concat (gyűjteményA.stream (), collectionB.stream ());
Ha kettőnél többet kell kombinálnia Patakok, meghívhatja a concat () módszer ismét az eredeti meghíváson belül:
Stream = Stream = Stream.concat (Stream.concat (collectionA.stream (), collectionB.stream ()), collectionC.stream ());
Fontos megjegyezni, hogy a Java 8 Patakok nem használhatók fel újra, ezért ezt vegye figyelembe, amikor a változókhoz rendeli őket.
2.2. Használni a flatMap () Módszer
A flatMap () metódus a Folyam miután ennek minden elemét kicserélték Folyam feltérképezett tartalommal Folyam amelyet a megadott leképezési függvény minden elemre történő alkalmazásával állítanak elő.
Az alábbi példa bemutatja a gyűjtemények egyesítését a flatMap () módszer. Kezdetben kap egy Folyam amelynek elemei a két gyűjtemény, és akkor ellapítja a Folyam mielőtt összevont listára gyűjtené:
Stream = Stream = Stream.of (collectionA, collectionB) .flatMap (Collection :: stream); Gyűjtemény collectionCombined = combinedStream.collect (Collectors.toList ());
3. Guava használata
A Google-tól származó Guava könyvtár számos kényelmi módszert kínál a gyűjtemények kezeléséhez, és Java 6-os vagy újabb verzióval használható.
3.1. Használni a Iterables.concat () Módszer
A Iterables.concat () módszer a guavai egyik kényelmes módszer, amelyet a gyűjtemények egyesítésére használnak:
Iterable combinedIterables = Iterables.unmodifiableIterable (Iterables.concat (collectionA, collectionA));
A Iterálható a visszaküldött gyűjteményekké alakítható:
Gyűjtemény collectionCombined = Lists.newArrayList (combinedIterables);
3.2. Maven-függőség
Adja hozzá a következő függőséget a Maven készülékéhez pom.xml fájl, amely tartalmazza a Guava könyvtárat a projektben:
com.google.guava guava 20.0
A Guava könyvtár legújabb verzióját a Maven Central adattárban találja meg.
4. Az Apache Commons gyűjtemények használata
Az Apache Commons Collections egy újabb segédprogram-könyvtár, amely segíti a különféle gyűjteményekkel való munkát. A könyvtár két segédprogramot kínál, amelyek felhasználhatók a gyűjtemények egyesítéséhez. Ebben a szakaszban ismerjük meg, hogyan működnek ezek a módszerek.
4.1. Használni a IterableUtils.chainedIterable () Módszer
A IterableUtils osztály használati módszereket és dekoratőröket biztosít a Iterálható példányok. Ez biztosítja a chainedIterable () módszer, amellyel több is kombinálható Iterálhatós egyetlen eggyé.
Iterable combinedIterables = IterableUtils.chainedIterable (gyűjteményA, gyűjteményB);
4.2. Használni a CollectionUtils.union () Módszer
Segédprogramok és dekorátorok Gyűjtemény példányokat a CollectionUtils osztály. A unió() metódus ebből az osztályból a Gyűjtemény az adott unióját tartalmazza Iterálható példányok.
Iterálható combinedIterables = CollectionUtils.union (collectionA, collectionB);
A unió() módszer szerint a visszaküldött gyűjtemény minden elemének számossága megegyezik az adott elem számosságának maximumával Iterable. Ez azt jelenti, hogy a kombinált gyűjtemény csak az első és a második gyűjtemény olyan elemeiből áll, amelyek nem voltak jelen az elsőben.
4.3. Maven-függőség
Adja hozzá a következő függőséget a Maven készülékéhez pom.xml fájl az Apache Commons Gyűjtemények könyvtárának a projektbe történő felvételéhez:
org.apache.commons commons-gyűjtemények4 4.1
Az Apache Commons könyvtár legújabb verzióját a Maven Central adattárban találja meg.
5. A Java 7 használata
Ha továbbra is a Java 7-et használja, és el akarja kerülni a harmadik féltől származó könyvtárakat, például a Guava-t, használhatja a az összes hozzáadása() módszer több gyűjtemény elemeinek kombinálásához, vagy saját kombinációs módszereket írhat össze Iterable.
5.1. Használni a az összes hozzáadása() Módszer
Természetesen a gyűjtemények kombinálásának legegyszerűbb megoldása a az összes hozzáadása() módszerrel, a következők szerint Lista példa, azonban érdemes megjegyezni, hogy ez a módszer egy új gyűjteményt hoz létre, további hivatkozásokkal ellátva azokat az objektumokat, amelyek az első két gyűjteményben találhatók:
List listC = new ArrayList (); listC.addAll (listA); listC.addAll (listB);
5.2. Egyéni írása concat () Módszer
Az alábbi példa meghatározza a concat () módszer, amely kettőt elfogad Iterable és összevontat ad vissza Iterálható tárgy:
public static Iterable concat (Iterable i1, Iterable i2) {return new Iterable () {public Iterator iterator () {return new Iterator () {Iterator listIterator = i1.iterator (); Boolean ellenőrizteHasNext; E nextValue; privát logikai indításTheSecond; void theNext () {if (listIterator.hasNext ()) {checkHasNext = true; nextValue = listIterator.next (); } else if (startTheSecond) ellenőrizteHasNext = hamis; else {startTheSecond = true; listIterator = i2.iterator (); a következő(); }} public logikai hasNext () {if (ellenőrizveHasNext == null) theNext (); return checkHasNext; } public E következő () {if (! hasNext ()) dob új NoSuchElementException (); checkHasNext = null; return nextValue; } public void remove () {listIterator.remove (); }}; }}; }
A concat () A metódus a két gyűjtemény argumentumként történő átadásával hívható elő:
Iterálható kombinált Iterables = concat (gyűjteményA, gyűjteményB); Gyűjtemény collectionCombined = makeListFromIterable (combinedIterables);
Ha szüksége van a Iterálható hogy elérhető legyen a Lista, használhatja a makeListFromIterable () módszer, amely a Lista felhasználva a Iterálható:
public static List makeListFromIterable (Iterable iter) {List list = new ArrayList (); for (E elem: iter) {list.add (item); } visszatérési lista; }
6. Következtetés
A cikk két különböző módszert taglalt két gyűjtemény logikai kombinálásában a Java-ban anélkül, hogy további hivatkozásokat hozna létre a bennük levő objektumokra.
Az oktatóanyag kódja elérhető a Githubon.