Apache Commons Gyűjtemények vs Google Guava

1. Áttekintés

Ebben az oktatóanyagban összehasonlítjuk két Java-alapú nyílt forráskódú könyvtár: Apache Commons és Google Guava. Mindkét könyvtár gazdag szolgáltatáskészlettel rendelkezik, sok segédprogram API-val, főként a gyűjteményekben és az I / O területeken.

A rövidség kedvéért itt csak a maroknyi leggyakrabban használtat írjuk le a gyűjtemények keretrendszeréből, kódmintákkal együtt. Meglátjuk a különbségeik összefoglalását is.

Ezenkívül cikkgyűjteményünk van, amely mélyen elmerül a különféle közönségekben és a guavai segédprogramokban.

2. A két könyvtár rövid története

A Google Guava egy Google-projekt, amelyet főként a szervezet mérnökei fejlesztettek ki, bár most már nyílt forrásból származnak. A Az indítás fő motivációja az volt, hogy a JDK 1.5-ben bevezetett generikus anyagokat beépítse a Java Collections-keretrendszerbe, vagy a JCF, és fokozza képességeit.

Megalakulása óta a könyvtár kibővítette képességeit, és most grafikonokat, funkcionális programozást, tartomány objektumokat, gyorsítótárat és Húr manipuláció.

Az Apache Commons Jakarta projektként indult az alapvető Java gyűjtemények API kiegészítésére, és végül az Apache Software Foundation projektjévé vált. Az évek során az újrafelhasználható Java-összetevők széles skálájával bővült számos más területen, ideértve (de nem kizárólag) a képalkotást, az I / O-t, a rejtjelezést, a gyorsítótárat, a hálózatot, az érvényesítést és az objektumkészletet.

Mivel ez egy nyílt forráskódú projekt, az Apache közösség fejlesztői folyamatosan bővítik ezt a könyvtárat, hogy bővítsék képességeit. Azonban, nagy gondot fordítanak a visszamenőleges kompatibilitás fenntartására.

3. Maven-függőség

A Guava felvételéhez hozzá kell adnunk függőségét a miénkhez pom.xml:

 com.google.guava guava 29.0-jre 

A legfrissebb verzió információ a Maven oldalon található.

Az Apache Commons esetében ez kicsit más. A használni kívánt segédprogramtól függően hozzá kell adnunk azt a bizonyosat. Például a gyűjteményekhez hozzá kell adnunk:

 org.apache.commons commons-gyűjtemények 4.4 

Kódmintáinkban használni fogjuk commons-gyűjtemények4.

Ugorjunk most a szórakoztató részbe!

4. Kétirányú térképek

A billentyűkkel elérhető térképeket, valamint az értékeket kétirányú térképeknek nevezzük. A JCF nem rendelkezik ezzel a funkcióval.

Nézzük meg, hogyan kínálja őket a két technológiánk. Mindkét esetben példát veszünk a hét napjaira, hogy megkapjuk a nap nevét annak számával együtt, és fordítva.

4.1. Guava's BiMap

A Guava interfészt kínál - BiMap, kétirányú térképként. Az egyik megvalósításával példányosítható EnumBiMap, EnumHashBiMap, HashBiMap, vagy ImmutableBiMap.

Itt használjuk HashBiMap:

BiMap daysOfWeek = HashBiMap.create ();

A feltöltés hasonló bármely Java-térképhez:

daysOfWeek.put (1, "hétfő"); daysOfWeek.put (2, "kedd"); daysOfWeek.put (3, "szerda"); daysOfWeek.put (4, "csütörtök"); daysOfWeek.put (5, "péntek"); daysOfWeek.put (6, "szombat"); daysOfWeek.put (7, "vasárnap");

És itt van néhány JUnit teszt a koncepció bizonyítására:

@Test public void givenBiMap_whenValue_thenKeyReturned () {assertEquals (Integer.valueOf (7), daysOfWeek.inverse (). Get ("vasárnap")); } @Test public void givenBiMap_whenKey_thenValueReturned () {assertEquals ("kedd", daysOfWeek.get (2)); }

4.2. Apache-ék BidiMap

Ehhez hasonlóan az Apache is biztosít nekünk BidiMap felület:

BidiMap daysOfWeek = új TreeBidiMap ();

Itt használjuk TreeBidiMap. Vannak azonban más megvalósítások is, például DualHashBidiMap és DualTreeBidiMap is.

Népszerűsítéséhez az értékeket úgy tehetjük meg, ahogyan tettük BiMap felett.

Használata is elég hasonló:

@Test public void givenBidiMap_whenValue_thenKeyReturned () {assertEquals (Integer.valueOf (7), daysOfWeek.inverseBidiMap (). Get ("vasárnap")); } @Test public void givenBidiMap_whenKey_thenValueReturned () {assertEquals ("kedd", daysOfWeek.get (2)); }

Néhány egyszerű teljesítményteszt során ez a kétirányú térkép Csak beillesztésekben maradt el guavai társától. Sokkal gyorsabb volt a kulcsok és az értékek beolvasása.

5. A kulcsok hozzárendelése több értékhez

Olyan felhasználási esetekre, amikor több kulcsot szeretnénk különböző értékekhez feltérképezni, például egy élelmiszerkocsi-gyűjtemény gyümölcsök és zöldségek számára, a két könyvtár egyedülálló megoldásokat kínál nekünk.

5.1. Guava's MultiMap

Először nézzük meg, hogyan lehet példányosítani és inicializálni MultiMap:

Multimap groceryCart = ArrayListMultimap.create (); groceryCart.put ("Gyümölcsök", "Alma"); groceryCart.put ("Gyümölcsök", "Szőlő"); groceryCart.put ("Gyümölcsök", "Szamóca"); groceryCart.put ("Zöldségek", "Spenót"); groceryCart.put ("Zöldségek", "Káposzta");

Ezután használunk néhány JUnit tesztet, hogy működés közben lássuk:

@Test public void givenMultiValuedMap_whenFruitsFetched_thenFruitsReturned () {List fruits = Arrays.asList ("Apple", "Szőlő", "Eper"); assertEquals (gyümölcsök, élelmiszerboltCart.get ("Gyümölcsök")); } @Test public void givenMultiValuedMap_whenVeggiesFetched_thenVeggiesReturned () {List veggies = Arrays.asList ("Spenót", "Káposzta"); assertEquals (zöldségek, groceryCart.get ("Zöldségek")); } 

Ezenkívül MultiMap lehetőséget ad arra, hogy eltávolítsunk egy adott bejegyzést vagy egy teljes értékkészletet a térképről:

@Test public void givenMultiValuedMap_whenFuitsRemoved_thenVeggiesPreserved () {assertEquals (5, groceryCart.size ()); groceryCart.remove ("Gyümölcsök", "Alma"); assertEquals (4, groceryCart.size ()); groceryCart.removeAll ("Gyümölcsök"); assertEquals (2, groceryCart.size ()); }

Mint láthatjuk, itt először eltávolítottuk alma tól Gyümölcsök beállított, majd eltávolította az egészet Gyümölcsök készlet.

5.2. Apache-ék MultiValuedMap

Ismét kezdjük az a MultiValuedMap:

MultiValuedMap groceryCart = new ArrayListValuedHashMap ();

Mivel a kitöltése megegyezik az előző szakaszban látottal, nézzük meg gyorsan a felhasználást:

@Test public void givenMultiValuedMap_whenFruitsFetched_thenFruitsReturned () {List fruits = Arrays.asList ("Apple", "Szőlő", "Eper"); assertEquals (gyümölcsök, élelmiszerboltCart.get ("Gyümölcsök")); } @Test public void givenMultiValuedMap_whenVeggiesFetched_thenVeggiesReturned () {List veggies = Arrays.asList ("Spenót", "Káposzta"); assertEquals (zöldségek, groceryCart.get ("Zöldségek")); }

Mint láthatjuk, felhasználása is ugyanaz!

Ebben az esetben azonban nincs lehetőségünk egyetlen bejegyzés eltávolítására, mint pl alma tól től Gyümölcsök.Csak a teljes készletet tudjuk eltávolítani Gyümölcsök:

@Test public void givenMultiValuedMap_whenFuitsRemoved_thenVeggiesPreserved () {assertEquals (5, groceryCart.size ()); groceryCart.remove ("Gyümölcsök"); assertEquals (2, groceryCart.size ()); }

6. Több kulcs hozzárendelése egy értékhez

Itt példát veszünk az egyes városokhoz feltérképezendő földrajzi szélességekről és hosszúságokról:

cityCoordinates.put ("40,7128 ° É", "74,0060 ° Ny", "New York"); cityCoordinates.put ("48.8566 ° É", "K 2.3522 °", "Párizs"); cityCoordinates.put ("19,0760 ° É", "72,8777 ° K", "Mumbai");

Most meglátjuk, hogyan lehet ezt elérni.

6.1. Guava's asztal

Guava felajánlja asztal amely kielégíti a fenti használati esetet:

Táblázat cityCoordinates = HashBasedTable.create ();

És íme néhány felhasználás, amelyet levezethetünk belőle:

@Test public void givenCoordinatesTable_whenFetched_thenOK () {List várhatóLongitudes = Arrays.asList ("74.0060 ° W", "2.3522 ° E", "72.8777 ° E"); assertArrayEquals (várhatóLongitudes.toArray (), cityCoordinates.columnKeySet (). toArray ()); List Várható Városok = Tömbök.asList ("New York", "Párizs", "Mumbai"); assertArrayEquals (vártCities.toArray (), cityCoordinates.values ​​(). toArray ()); assertTrue (cityCoordinates.rowKeySet (). tartalmazza ("48,8566 ° É")); }

Mint láthatjuk, kaphatunk egy Készlet a sorok, oszlopok és értékek nézete.

asztal lehetőséget kínál arra is, hogy lekérdezzük sorait vagy oszlopait.

Tekintsünk egy filmasztalt ennek bemutatására:

Asztali filmek = HashBasedTable.create (); filmek.put ("Tom Hanks", "Meg Ryan", "Megvan a levél"); filmek.put ("Tom Hanks", "Catherine Zeta-Jones", "A terminál"); filmek.put ("Bradley Cooper", "Lady Gaga", "Egy csillag született"); filmek.put ("Keenu Reaves", "Sandra Bullock", "Speed"); movies.put ("Tom Hanks", "Sandra Bullock", "Rendkívül hangos és hihetetlenül közeli");

És itt van néhány minta, magától értetődő keresés, amelyet elvégezhetünk filmeketasztal:

@Test public void givenMoviesTable_whenFetched_thenOK () {assertEquals (3, movies.row ("Tom Hanks"). Size ()); assertEquals (2, filmek.oszlop ("Sandra Bullock"). méret ()); assertEquals ("Egy csillag született", filmek.get ("Bradley Cooper", "Lady Gaga"); assertTrue (filmek.containsValue ("Sebesség")); }

Azonban, asztal csak két kulcs feltérképezésére korlátoz minket. Guavában egyelőre nincs alternatívánk, hogy kettőnél több kulcsot hozzunk létre egyetlen értékhez.

6.2. Apache-ék MultiKeyMap

Visszatérve a mi városkoordináták Például, itt megtudhatjuk, hogyan manipulálhatjuk MultiKeyMap:

@Test public void givenCoordinatesMultiKeyMap_whenQueried_thenOK () {MultiKeyMap cityCoordinates = new MultiKeyMap (); // feltölti a kulcsokat és értékeket, amint azt korábban bemutattuk. Várható hosszúságok = Arrays.asList ("72.8777 ° K", "2.3522 ° K", "74.0060 ° W"); Sorolja fel a hosszúságokat = new ArrayList (); cityCoordinates.forEach ((kulcs, érték) -> {longitudes.add (key.getKey (1));}); assertArrayEquals (várhatóHosszúságok.Array (), hosszúságok.toArray ()); List VárhatóCities = Arrays.asList ("Mumbai", "Párizs", "New York"); Városok listája = new ArrayList (); cityCoordinates.forEach ((kulcs, érték) -> {városok.add (érték);}); assertArrayEquals (vártCities.toArray (), városok.toArray ()); }

Amint a fenti kódrészletből láthatjuk, ugyanazokhoz az állításokhoz juthatunk, mint Guava esetében asztal, meg kellett ismételnünk a MultiKeyMap.

Azonban, MultiKeyMap kettőnél több kulcs leképezését is lehetővé teszi egy értékhez. Például lehetőséget ad arra, hogy a hét napjait hétköznapként vagy hétvégenként feltérképezzük:

@Test public void givenDaysMultiKeyMap_whenFetched_thenOK () {days = new MultiKeyMap (); days.put ("hétfő", "kedd", "szerda", "csütörtök", "péntek", "hétköznap"); days.put ("szombat", "vasárnap", "hétvége"); assertFalse (days.get ("szombat", "vasárnap"). egyenlő ("hétköznap")); }

7. Apache Commons Gyűjtemények vs. Google Guava

Mérnökei szerint A Google Guava abból a célból született, hogy generikumokat kellett használni a könyvtárban, amit az Apache Commons nem ajánlott fel. Ez követi a gyűjtemények API követelményeit is. A másik nagy előny, hogy aktív fejlesztés alatt áll, és gyakran megjelennek az új kiadások.

Az Apache azonban előnyt kínál a teljesítmény tekintetében, miközben értéket gyűjt a gyűjteményből. A szúrási időt tekintve azonban Guava mégis elveszi a tortát.

Bár csak a gyűjtemények API-kat hasonlítottuk össze a kódmintáinkban Az Apache Commons egésze sokkal nagyobb funkciókat kínál, mint a Guava.

8. Következtetés

Ebben az oktatóanyagban összehasonlítottuk az Apache Commons és a Google Guava által kínált néhány funkciót, különösen a gyűjtemények keretrendszerében.

Itt csupán megvakartuk a két könyvtár kínálatának felületét.

Sőt, ez sem egy, sem összehasonlítás. Ahogy a kódmintáink bizonyították, vannak olyan jellemzők, amelyek mindegyike egyedi, és lehetnek olyan helyzetek, amikor mindkettő együtt élhet.

Mint mindig, a forráskód is elérhető a GitHubon.