A Térképek használata az adatfolyamok használatával

1. Bemutatkozás

Ebben az oktatóanyagban néhány példát tárgyalunk a Java használatáról Folyamsvalakivel együtt dolgozni Térképs. Érdemes megjegyezni, hogy ezek közül a gyakorlatok közül néhány kétirányú segítségével megoldható Térkép adatstruktúra, de itt egy funkcionális megközelítés érdekel.

Először elmagyarázzuk az alapötletet, amellyel dolgozni fogunk Térképek és Folyams. Ezután bemutatunk pár különböző problémát Térképek és konkrét megoldásaikat felhasználva Folyams.

2. Alapötlet

A legfontosabb dolog, amit észre kell venni Folyams olyan elemek szekvenciája, amelyek könnyen megszerezhetők az a-ból Gyűjtemény.

Térképek eltérő felépítésű, kulcsok és értékek közötti leképezéssel, sorrend nélkül. Ez nem azt jelenti, hogy a Térkép különböző szekvenciákká strukturálódhat, amelyek lehetővé teszik számunkra, hogy természetes módon dolgozzunk a Stream API-val.

Nézzük meg a különböző módszerek megszerzésének módjait Gyűjteménys a-tól Térkép, amelyet aztán a-ba forgathatunk Folyam:

Map someMap = új HashMap ();

Nyerhetünk kulcs-érték párokat:

Készlet bejegyzések = someMap.entrySet ();

Megkaphatjuk a kulcshoz tartozó kulcskészletet is Térkép:

Set keySet = someMap.keySet ();

Vagy dolgozhatnánk közvetlenül az értékekkel:

Gyűjtemény értékei = someMap.values ​​();

Ezek mindegyike megadja nekünk a belépési pontot a gyűjtemények feldolgozásához azáltal, hogy adatfolyamokat szerezünk belőlük:

Folyam entryStream = bejegyzések.stream (); Stream értékekStream = values.stream (); Stream kulcsokStream = keySet.stream ();

3. A TérképA billentyűk használata Folyams

3.1. Beviteli adat

Tegyük fel, hogy van egy Térkép:

Térképes könyvek = új HashMap (); books.put ("978-0201633610", "Tervezési minták: újrafelhasználható objektum-orientált szoftver elemei"); books.put ("978-1617291999", "Java 8 in Action: Lambdas, Stream és funkcionális stílusú programozás"); books.put ("978-0134685991", "Effektív Java");

Szeretnénk megtalálni az „Effective Java” címet viselő könyv ISBN-jét.

3.2. Egyezés visszakeresése

Mivel a könyv címe nem létezhetett a miénkben Térkép, szeretnénk jelezni, hogy nincs társított ISBN hozzá. Használhatunk egy Választható hogy ezt kifejezze:

Tegyük fel, hogy ennél a példánál érdekel egy olyan könyv bármely kulcsa, amely megfelel ennek a címnek:

Opcionálisan választhatóIsbn = books.entrySet (). Stream () .filter (e -> "Effective Java" .equals (e.getValue ())) .map (Map.Entry :: getKey) .findFirst (); assertEquals ("978-0134685991", választhatóIsbn.get ());

Elemezzük a kódot. Első, megszerezzük a entrySet tól Térkép, amint azt korábban láttuk.

Csak az „Effektív Java” bejegyzéseket szeretnénk figyelembe venni címként, így az első köztes művelet szűrő lesz.

Nem érdekel az egész Térkép bejegyzést, de az egyes bejegyzések kulcsában. Tehát a következő láncolt közbenső művelet éppen ezt teszi: ez a térkép művelet, amely kimenetként egy új adatfolyamot generál, amely csak azokat a kulcsokat tartalmazza, amelyek megfelelnek a keresett címnek.

Mivel csak egy eredményre vágyunk, alkalmazhatjuk a findFirst () terminál működése, amely megadja a kezdeti értéket a Folyam mint egy Választható tárgy.

Lássunk egy esetet, amikor nem létezik cím:

Opcionálisan választhatóIsbn = books.entrySet (). Stream () .filter (e -> "Nem létező cím" .equals (e.getValue ())) .map (Map.Entry :: getKey) .findFirst (); assertEquals (hamis, választhatóIsbn.isPresent ());

3.3. Több találat lekérése

Változtassunk most a problémán, hogy lássuk, hogyan tudnánk kezelni egy eredmény helyett több eredmény visszaküldését.

Ha több eredményt szeretnénk visszaküldeni, adjuk hozzá a következő könyvet a könyvünkhöz Térkép:

books.put ("978-0321356680", "Effective Java: Second Edition"); 

Tehát most, ha keressük minden „Hatékony Java” -val kezdődő könyveket, több eredményt kapunk vissza:

IsbnCodes = books.entrySet (). Stream () .filter (e -> e.getValue (). StartsWith ("Effektív Java"))) .map (Map.Entry :: getKey) .collect (Collectors.toList () ); assertTrue (isbnCodes.contains ("978-0321356680")); assertTrue (isbnCodes.contains ("978-0134685991"));

Ebben az esetben a szűrő feltételének cseréjével ellenőrizzük, hogy a Térkép a „Hatékony Java” -val kezdődik, ahelyett, hogy összehasonlítaná Húr egyenlőség.

Ezúttal, mi gyűjt az eredmények - ahelyett, hogy az elsőt választaná - a meccseket a Lista.

4. A Térkép’S értékeinek használata Folyams

Most koncentráljunk egy másik problémára a térképekkel: A megszerzés helyett ISBN-ek alapján címek, megpróbáljuk megszerezni címek alapján ISBN-ek.

Használjuk az eredetit Térkép. Meg akarjuk találni azokat a címeket, amelyek ISBN-jének kezdete „978-0”.

Lista címek = books.entrySet (). Stream () .filter (e -> e.getKey (). StartsWith ("978-0")) .map (Map.Entry :: getValue) .collect (Collectors.toList ( )); assertEquals (2, címek.méret ()); assertTrue (title.contains ("Tervezési minták: újrafelhasználható objektumorientált szoftver elemei")); assertTrue (title.contains ("Hatékony Java"));

Ez a megoldás hasonló a korábbi problémakészleteink megoldásához - streameljük a belépési halmazt, majd szűrjük, feltérképezzük és összegyűjtjük.

És mint korábban, ha csak az első mérkőzést szeretnénk visszatérni, akkor a térkép metódus hívja a findFirst () módszer helyett az összes eredmény összegyűjtését a Lista.

5. Következtetés

Megmutattuk, hogyan kell feldolgozni a Térkép funkcionális módon.

Különösen azt tapasztaltuk, hogy ha egyszer a társított gyűjtemények használatára váltunk Térképs, a feldolgozás Folyams sokkal könnyebbé és intuitívabbá válik.

És természetesen az összes példa megtalálható a GitHub projektben.