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.