DistinctBy a Java Stream API-ban

1. Áttekintés

Különböző elemek keresése a listában az egyik gyakori feladat, amellyel programozókként általában szembesülünk. A Java 8-tól kezdve a Patakok új API-val rendelkezünk az adatok funkcionális megközelítéssel történő feldolgozásához.

Ebben a cikkben különböző alternatívákat mutatunk be a gyűjtemény szűrésére a lista objektumainak egy adott attribútuma segítségével.

2. A Stream API használata

A Stream API biztosítja a különböző() metódus, amely a lista különböző elemeit adja vissza a egyenlő () módszere Tárgy osztály.

Ugyanakkor kevésbé rugalmas, ha egy adott attribútum alapján akarunk szűrni. Az egyik alternatívánk az, hogy olyan szűrőt írunk, amely fenntartja az állapotot.

2.1. Állapotszerű szűrő használata

Az egyik lehetséges megoldás az állapotfeltárás megvalósítása lenne Állítmány:

public static Predikálja a különByKey-t (Function keyExtractor) {Map seen = new ConcurrentHashMap (); return t -> seen.putIfAbsent (keyExtractor.apply (t), Boolean.TRUE) == null; }

A teszteléshez a következőket fogjuk használni Személy osztály, amely rendelkezik az attribútumokkal kor, email, és név:

public class Személy {private int age; privát karakterlánc neve; privát karakterlánc e-mail; // szabványos mérőeszközök és beállítók}

És hogy új szűrt gyűjteményt szerezzen név, tudjuk használni:

List personListFiltered = personList.stream () .filter (differentByKey (p -> p.getName ())) .collect (Collectors.toList ());

3. Az Eclipse gyűjtemények használata

Az Eclipse Collections egy olyan könyvtár, amely további módszereket kínál a feldolgozáshoz Patakok és Java-gyűjtemények.

3.1. Használni a ListIterate.distinct ()

A ListIterate.distinct () módszer lehetővé teszi számunkra a Folyam különféle felhasználásával HashingStrategies. Ezeket a stratégiákat lambda kifejezések vagy módszerreferenciák segítségével lehet meghatározni.

Ha szűrni akarunk a Személy név:

List personListFiltered = ListIterate .distinct (personList, HashingStrategies.fromFunction (Person :: getName));

Vagy ha az általunk használni kívánt attribútum primitív (int, long, double), használhatunk egy ilyen speciális funkciót:

List personListFiltered = ListIterate.distinct (personList, HashingStrategies.fromIntFunction (Person :: getAge));

3.2. Maven-függőség

A következő függőségeket kell hozzáadnunk a sajátunkhoz pom.xml az Eclipse Gyűjtemények felhasználása projektünkben:

 org.eclipse.collections eclipse-gyűjtemények 8.2.0 

Az Eclipse Collections könyvtár legújabb verzióját a Maven Central adattárban találja meg.

Ha többet szeretne megtudni erről a könyvtárról, keresse fel ezt a cikket.

4. A Vavr (Javaslang)

Ez egy funkcionális könyvtár a Java 8 számára, amely megváltoztathatatlan adatokat és funkcionális vezérlési struktúrákat biztosít.

4.1. Használata List.distinctBy

A listák szűréséhez ez az osztály megadja a saját Lista osztályát, amelynek a differentBy () módszer, amely lehetővé teszi számunkra, hogy a benne lévő objektumok attribútumai szerint szűrjünk:

List personListFiltered = List.ofAll (personList) .distinctBy (Person :: getName) .toJavaList ();

4.2. Maven-függőség

A következő függőségeket adjuk hozzá pom.xml hogy felhasználjuk a Vavr-t a projektünkben.

 io.vavr vavr 0.9.0 

A Vavr könyvtár legújabb verzióját a Maven Central adattárban találja meg.

Ha többet szeretne megtudni erről a könyvtárról, keresse fel ezt a cikket.

5. A StreamEx használata

Ez a könyvtár hasznos osztályokat és módszereket kínál a Java 8 adatfolyamok feldolgozásához.

5.1. Használata StreamEx.distinct

Az osztályokon belül a biztosított StreamEx amelynek van különböző módszer, amelyre hivatkozást küldhetünk arra az attribútumra, ahol meg akarunk különböztetni:

List personListFiltered = StreamEx.of (personList) .distinct (Person :: getName) .toList ();

5.2. Maven-függőség

A következő függőségeket adjuk hozzá pom.xml hogy a StreamEx-et használjuk a projektünkben.

 egy.util streamex 0.6.5 

A StreamEx könyvtár legújabb verzióját a Maven Central adattárban találja meg.

6. Következtetés

Ebben a gyors bemutatóban példákat tártunk fel arra, hogyan lehet a Stream különböző elemeit megszerezni egy attribútum alapján, a szokásos Java 8 API használatával, és további alternatívákkal más könyvtárakkal.

Mint mindig, a teljes kód elérhető a GitHubon.