DistinctBy v rozhraní Java Stream API

1. Prehľad

Vyhľadávanie rôznych prvkov v zozname je jednou z bežných úloh, ktorej ako programátori obvykle čelíme. Od Javy 8 ďalej so zahrnutím Prúdy máme nové API na spracovanie údajov pomocou funkčného prístupu.

V tomto článku si ukážeme rôzne alternatívy filtrovania kolekcie pomocou konkrétneho atribútu objektov v zozname.

2. Používanie Stream API

Stream API poskytuje odlišný() metóda, ktorá vracia rôzne prvky zoznamu na základe rovná sa () metóda Objekt trieda.

Ak však chceme filtrovať podľa konkrétneho atribútu, stane sa menej flexibilným. Jednou z alternatív, ktorú máme, je napísať filter, ktorý udržuje stav.

2.1. Používanie stavového filtra

Jedným z možných riešení by bolo zavedenie stavu Predikát:

public static Predicate distinctByKey (Function keyExtractor) {Videná mapa = nová ConcurrentHashMap (); return t -> seen.putIfAbsent (keyExtractor.apply (t), Boolean.TRUE) == null; }

Na otestovanie použijeme nasledujúce Osoba trieda, ktorá má atribúty Vek, e-maila názov:

public class Osoba {private int age; súkromné ​​meno reťazca; súkromný reťazcový e-mail; // štandardné getre a setre}

A získať novú filtrovanú kolekciu pomocou názov, môžeme použiť:

Zoznam personListFiltered = personList.stream () .filter (zreteľnýByKey (p -> p.getName ())) .collect (Collectors.toList ());

3. Používanie zbierok Eclipse

Eclipse Collections je knižnica, ktorá poskytuje ďalšie metódy spracovania Prúdy a zbierky v Jave.

3.1. Pomocou ListIterate.distinct ()

The ListIterate.distinct () metóda nám umožňuje filtrovať a Prúd pomocou rôznych HashingStrategies. Tieto stratégie je možné definovať pomocou výrazov lambda alebo odkazov na metódy.

Ak chceme filtrovať podľa Osoby názov:

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

Alebo ak je atribút, ktorý budeme používať, primitívny (int, long, double), môžeme použiť špecializovanú funkciu, ako je táto:

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

3.2. Maven závislosť

Musíme pridať nasledujúce závislosti do našej pom.xml používať kolekcie Eclipse v našom projekte:

 zbierky zatmenia org.eclipse.collections 8.2.0 

Najnovšiu verziu knižnice Eclipse Collections nájdete v úložisku Maven Central.

Ak sa chcete dozvedieť viac informácií o tejto knižnici, prejdite na tento článok.

4. Používanie Vavr (Javaslang)

Toto je funkčná knižnica pre Java 8, ktorá poskytuje nemenné dáta a funkčné riadiace štruktúry.

4.1. Použitím List.distinctBy

Na filtrovanie zoznamov poskytuje táto trieda svoju vlastnú triedu List, ktorá má zreteľnýBy () metóda, ktorá nám umožňuje filtrovať podľa atribútov objektov, ktoré obsahuje:

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

4.2. Maven závislosť

K našej pridáme nasledujúce závislosti pom.xml použiť Vavr v našom projekte.

 io.vavr vavr 0.9.0 

Najnovšiu verziu knižnice Vavr nájdete v centrálnom úložisku Maven.

Ak sa chcete dozvedieť viac informácií o tejto knižnici, prejdite na tento článok.

5. Používanie StreamEx

Táto knižnica poskytuje užitočné triedy a metódy na spracovanie prúdov Java 8.

5.1. Použitím StreamEx. Zreteľný

V rámci poskytovaných tried je StreamEx ktorý má odlišný metóda, ktorej môžeme poslať odkaz na atribút, kde ho chceme rozlíšiť:

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

5.2. Maven závislosť

K našej pridáme nasledujúce závislosti pom.xml použiť StreamEx v našom projekte.

 one.util streamex 0,6,5 

Najnovšiu verziu knižnice StreamEx nájdete v centrálnom úložisku Maven.

6. Záver

V tomto rýchlom výučbe sme preskúmali príklady toho, ako získať rôzne prvky streamu na základe atribútu pomocou štandardného rozhrania Java 8 API a ďalších alternatív s inými knižnicami.

Celý kód je ako vždy k dispozícii na stránkach GitHub.


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