Útmutató a Java 8 csoportosításához a Collector által

1. Bemutatkozás

Ebben az oktatóanyagban meglátjuk, hogyan csoportosításBy gyűjtő különféle példák felhasználásával dolgozik.

Ahhoz, hogy megértsük a bemutató anyagát, alapismeretekre van szükségünk a Java 8 szolgáltatásairól. Ezeket az alapokat áttekinthetjük a Java 8 Stream bevezetőjében és a Java 8 gyűjtői útmutatójában.

2. csoportosításBy Gyűjtők

A Java 8 Folyam Az API lehetővé teszi számunkra az adatgyűjtések deklaratív feldolgozását.

A statikus gyári módszerek Collectors.groupingBy () és Collectors.groupingByConcurrent () biztosítson számunkra a „CSOPORTOSÍT' záradék az SQL nyelvben. Használjuk őket objektumok egyes tulajdonságok szerinti csoportosításához és az eredmények tárolásához a Térkép példa.

A túlterhelt módszerek csoportosításBy vannak:

  • Először egy osztályozási függvénnyel a módszer paramétereként:

statikus Gyűjtő<>> groupingBy (Funkció osztályozó)
  • Másodszor, egy osztályozási függvénnyel és egy második gyűjtővel a módszer paramétereként:

statikus Gyűjtő groupingBy (Funkció-osztályozó, Gyűjtő downstream)
  • Végül egy osztályozási függvénnyel, egy szállítói módszerrel (amely biztosítja a Térkép megvalósítás, amely tartalmazza a végeredményt), és egy második gyűjtő, mint metódus paraméter:

statikus  Gyűjtő csoportosításaBy (Funkció osztályozó, Szállítói térképgyár, Gyűjtő a lefelé)

2.1. Példa a kód beállítására

A. Használatának bemutatása groupingBy (), definiáljuk a Blog bejegyzés osztály (a. adatfolyamot fogjuk használni Blog bejegyzés tárgyak):

osztály BlogPost {String title; Vonós szerző; BlogPostType típus; int kedveli; } 

Ezután a BlogPostType:

enum BlogPostType {HÍREK, ÁTTEKINTÉS, ÚTMUTATÓ} 

Aztán a Lista nak,-nek Blog bejegyzés tárgyak:

Lista bejegyzések = Arrays.asList (...);

Határozzuk meg a Tuple osztály, amelyet a bejegyzések csoportosításával fognak használni típus és szerző attribútumok:

osztály Tuple {BlogPostType típus; Vonós szerző; } 

2.2. Egyszerű csoportosítás egyetlen oszlop alapján

Kezdjük a legegyszerűbbel csoportosításBy metódus, amely csak osztályozási függvényt vesz paraméterül. Osztályozási függvényt alkalmaznak az adatfolyam minden elemére. A függvény által visszaadott értéket kulcsként használjuk a térképhez, amelyet a csoportosításBy gyűjtő.

A blogbejegyzések csoportosítása a blogbejegyzések listáján típus:

Térkép postsPerType = posts.stream () .collect (groupingBy (BlogPost :: getType)); 

2.3. csoportosításBy egy Komplexummal Térkép Kulcs típusa

Az osztályozási függvény nem korlátozódik csak skalár vagy String érték visszaadására. Az eredményül kapott térkép kulcsa bármilyen objektum lehet, amennyiben gondoskodunk a szükséges megvalósításáról egyenlő és hash kód mód.

A blogbejegyzések csoportosítása a listában a típus és szerző egyesítve a Tuple példa:

Térkép postsPerTypeAndAuthor = posts.stream () .collect (groupingBy (post -> new Tuple (post.getType (), post.getAuthor ()))); 

2.4. A visszatérők módosítása Térkép Érték tipusa

A második túlterhelés csoportosításBy vesz egy további második kollektort (downstream kollektor), amelyet az első kollektor eredményeire alkalmaznak.

Ha osztályozási függvényt adunk meg, de egy downstream gyűjtőt nem, a toList () gyűjtőt használják a színfalak mögött.

Használjuk a beállít() kollektor, mint a downstream kollektor, és kap egy Készlet blogbejegyzések (a helyett Lista):

Térkép postsPerType = posts.stream () .collect (groupingBy (BlogPost :: getType, toSet ())); 

2.5. Csoportosítás több mező szerint

A downstream kollektor eltérő alkalmazása a másodlagos elvégzése csoportosításBy az első csoport eredményeihez.

A csoportosításhoz Lista nak,-nek Blog bejegyzéss elsőként szerző majd által típus:

Térkép map = posts.stream () .collect (groupingBy (BlogPost :: getAuthor, groupingBy (BlogPost :: getType)));

2.6. Az átlag megszerzése a csoportosított eredményekből

A downstream kollektor használatával aggregációs függvényeket alkalmazhatunk a besorolási függvény eredményeiben.

Például a kedveli minden blogbejegyzéshez típus:

Térkép átlagosLikesPerType = posts.stream () .collect (groupingBy (BlogPost :: getType, averagingInt (BlogPost :: getLikes))); 

2.7. Az összeg megszerzése a csoportosított eredményekből

A teljes összeg kiszámításához kedveli az egyes típus:

Térkép likesPerType = posts.stream () .collect (groupingBy (BlogPost :: getType, summingInt (BlogPost :: getLikes))); 

2.8. A maximum vagy a minimum megszerzése a csoportosított eredményekből

Egy másik összesítés, amelyet végre tudunk hajtani, az, hogy a blogbejegyzést a lehető legtöbb lájkolással kapjuk meg:

Térkép maxLikesPerPostType = posts.stream () .collect (groupingBy (BlogPost :: getType, maxBy (összehasonlítóInt (BlogPost :: getLikes)))); 

Hasonlóképpen alkalmazhatjuk a minBy downstream gyűjtő, hogy megkapja a minimális számú blogbejegyzést kedveli.

Vegye figyelembe, hogy a maxBy és minBy a gyűjtők figyelembe veszik annak lehetőségét, hogy a gyűjtemény, amelyre alkalmazzák őket, üres lehet. Ezért van az érték típusa a térképen Választható.

2.9. Összefoglalás a csoportosított eredmények attribútumához

A Gyűjtők Az API összefoglaló gyűjtőt kínál, amelyet felhasználhatunk olyan esetekben, amikor egyszerre kell kiszámítanunk egy numerikus attribútum számát, összegét, minimumát, maximumát és átlagát.

Számítsunk ki egy összefoglalót a blogbejegyzések tetszik attribútumához az egyes típusokhoz:

Map likeStatisticsPerType = posts.stream () .collect (groupingBy (BlogPost :: getType, summarizingInt (BlogPost :: getLikes))); 

A IntSummaryStatistics Az egyes típusok objektumai tartalmazzák a. számának, összegének, átlagának, min és max értékét kedveli tulajdonság. További összefoglaló objektumok léteznek kettős és hosszú értékekhez.

2.10. Csoportosított eredmények hozzárendelése egy másik típushoz

Az a alkalmazásával bonyolultabb összesítéseket érhetünk el feltérképezése downstream gyűjtő az osztályozási függvény eredményeihez.

Vegyünk egy összefűzést a címaz egyes blogbejegyzések bejegyzéseit típus:

Map postsPerType = posts.stream () .collect (groupingBy (BlogPost :: getType, leképezés (BlogPost :: getTitle, csatlakozás (",", "Bejegyzések címei: [", "]")))); 

Amit itt tettünk, az az, hogy mindegyiket feltérképezzük Blog bejegyzés például annak cím majd az összefűzhetőre redukálja a bejegyzések címét Húr. Ebben a példában a Térkép értéke szintén eltér az alapértelmezettől Lista típus.

2.11. A visszatérés módosítása Térkép típus

A csoportosításBy gyűjtő, nem tehetünk feltételezéseket a visszaküldött típusáról Térkép. Ha konkrétak akarunk lenni arról, hogy melyik típusú Térkép által el akarunk jutni a csoporttól, akkor használhatjuk a csoportosításBy módszer, amely lehetővé teszi számunkra a Térkép elhaladva a Térkép beszállítói funkció.

Töltsük le a EnumMap an elhaladásával EnumMap beszállítói funkció a csoportosításBy módszer:

EnumMap postsPerType = posts.stream () .collect (groupingBy (BlogPost :: getType, () -> új EnumMap (BlogPostType.class), toList ())); 

3. Egyidejű csoportosításBy Gyűjtő

Hasonló csoportosításBy az a groupingByConcurrent gyűjtő, amely a többmagos architektúrákat használja. Ennek a gyűjtőnek három túlterhelt módszere van, amelyek pontosan ugyanazokat az argumentumokat veszik fel, mint a csoportosításBy gyűjtő. A. Visszatérési típusa groupingByConcurrent a gyűjtőnek azonban a ConcurrentHashMap osztály vagy annak egy alosztálya.

A csoportosítási művelet egyidejű végrehajtásához a folyamnak párhuzamosnak kell lennie:

ConcurrentMap postsPerType = posts.parallelStream () .collect (groupingByConcurrent (BlogPost :: getType)); 

Ha úgy döntünk, hogy átmegyünk a Térkép beszállítói funkció a groupingByConcurrent gyűjtő, akkor meg kell győződnünk arról, hogy a függvény visszaadja-e a ConcurrentHashMap vagy annak egy alosztálya.

4. Java 9 kiegészítések

A Java 9 két új, jól működő gyűjtőt mutatott be csoportosításBy; róluk további információk találhatók itt.

5. Következtetés

Ebben a cikkben a csoportosításBy gyűjtő által kínált Java 8 Gyűjtők API.

Megtanultuk, hogyan csoportosításBy felhasználható az elemek áramának osztályozására az egyik attribútumuk alapján, és hogyan lehet ennek a besorolásnak az eredményeit tovább összegyűjteni, mutálni és végső konténerekké redukálni.

Az ebben a cikkben szereplő példák teljes megvalósítása megtalálható a GitHub projektben.


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