Java 8 Collectors toMap
1. Bemutatkozás
Ebben a gyors bemutatóban a térképre() módszere Gyűjtők osztály. Gyűjtésre fogjuk használni Folyams bele a Térkép példa.
Az itt bemutatott összes példa esetében a könyvek listáját használjuk kiindulópontként, és ezt különbözővé alakítjuk Térkép megvalósítások.
2. Lista nak nek Térkép
Kezdjük a legegyszerűbb esetben, az a átalakításával Lista ba be Térkép.
A mi Könyv osztály:
osztály Könyv {privát karakterlánc neve; private int releaseYear; privát String isbn; // szerelők és beállítók}
És létrehozunk egy könyvet a kód hitelesítéséhez:
List bookList = new ArrayList (); bookList.add (új könyv ("A gyűrű ösztöndíjasa", 1954, "0395489318"); bookList.add (új könyv ("A két torony", 1954, "0345339711")); bookList.add (új könyv ("A király visszatér", 1955, "0618129111"));
Ebben a forgatókönyvben a következő túlterhelést fogjuk használni térképre() módszer:
Gyűjtő toMap (Function keyMapper, Function valueMapper)
Val vel térképre, stratégiákat jelezhetünk a térkép kulcsának és értékének megszerzéséhez:
public Map listToMap (Könyvek listája) {return books.stream (). gyűjt (Collectors.toMap (Könyv :: getIsbn, Könyv :: getName)); }
És könnyen ellenőrizhetjük, hogy működik-e:
@Test public void whenConvertFromListToMap () {assertTrue (convertToMap.listToMap (bookList) .size () == 3); }
3. Kulcskonfliktusok megoldása
A fenti példa jól működött, de mi történne, ha van duplikátum kulcs?
Képzeljük el, hogy kulcsot kaptunk Térkép mindegyik által KönyvMegjelenési éve:
public Map listToMapWithDupKeyError (Könyvek listája) {return books.stream (). collect (Collectors.toMap (Book :: getReleaseYear, Function.identity ())); }
Korábbi könyvlistánk alapján egy IllegalStateException:
@Test (várható = IllegalStateException.class) public void, amikorMapHasDuplicateKey_without_merge_function_then_runtime_exception () {convertToMap.listToMapWithDupKeyError (bookList); }
A megoldáshoz egy másik módszert kell használnunk, egy további paraméterrel, a mergeFunction:
Collector toMap (Function keyMapper, Function valueMapper, BinaryOperator mergeFunction)
Vezessünk be egy egyesítési függvényt, amely jelzi, hogy ütközés esetén megtartjuk a meglévő bejegyzést:
public Map listToMapWithDupKey (Könyvek listája) {return books.stream (). collect (Collectors.toMap (Könyv :: getReleaseYear, Funkció.identity (), (meglévő, csere) -> meglévő)); }
Vagy más szavakkal, az első győzelem viselkedését tapasztaljuk:
@Test public void whenMapHasDuplicateKeyThenMergeFunctionHandlesCollision () {Map booksByYear = convertToMap.listToMapWithDupKey (bookList); assertEquals (2, booksByYear.size ()); assertEquals ("0395489318", booksByYear.get (1954) .getIsbn ()); }
4. Egyéb térképtípusok
Alapértelmezés szerint a térképre() metódus a HashMap.
De visszatérhetünk-e másként Térkép megvalósítások? A válasz igen:
Collector toMap (Funkció keyMapper, Funkció valueMapper, BinaryOperator mergeFunction, Szállítói térképSupplier)
Hol a mapSupplier olyan funkció, amely új, üres értéket ad vissza Térkép az eredményekkel.
4.1. Lista nak nek ConcurrentMap
Vegyük ugyanazt a példát, mint fent, és adjunk hozzá egy a-t mapSupplier függvény a ConcurrentHashMap:
public Map listToConcurrentMap (Könyvek listája) {return books.stream (). collect (Collectors.toMap (Book :: getReleaseYear, Function.identity (), (o1, o2) -> o1, ConcurrentHashMap :: new)); }
Folytassuk és teszteljük a kódunkat:
@Test public void whenCreateConcurrentHashMap () {assertTrue (convertToMap.listToConcurrentMap (bookList) példája ConcurrentHashMap); }
Végül nézzük meg, hogyan adhatunk vissza egy rendezett térképet. Ehhez a TreeMap mint a mapSupplier paraméter.
Mert a TreeMap alapértelmezés szerint a kulcsok természetes sorrendje szerint van rendezve, nem kell kifejezetten a sort rendezni könyveket minket:
public TreeMap listToSortedMap (Könyvek listája) {return books.stream () .collect (Collectors.toMap (Könyv :: getName, Funkció.identitás (), (o1, o2) -> o1, TreeMap :: új)); }
Tehát esetünkben a visszatért TreeMap ábécé sorrendben lesz rendezve a könyv neve szerint:
@Test public void whenMapisSorted () {assertTrue (convertToMap.listToSortedMap (bookList) .firstKey (). Egyenlő ("A gyűrű ösztöndíja")); }
Ebben a cikkben megvizsgáltuk a térképre() módszere Gyűjtők osztály. Ez lehetővé teszi számunkra, hogy újat hozzunk létre Térkép a-tól Folyam. Megtanultuk a legfontosabb konfliktusok megoldását és a különböző térképi megvalósítások létrehozását is.
Mint mindig, a kód elérhető a GitHubon.