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); }
4.2. Rendezve Térkép

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")); }
5. Következtetés

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.