Zbierky Apache Commons vs Google Guava

1. Prehľad

V tomto výučbe to porovnáme dve otvorené zdrojové knižnice založené na prostredí Java: Apache Commons a Google Guava. Obidve knižnice majú bohatú sadu funkcií s množstvom užitočných rozhraní API, hlavne v oblasti kolekcií a I / O.

Pre stručnosť tu popíšeme iba niekoľko najbežnejšie používaných z rámca kolekcií spolu s ukážkami kódu. Uvidíme tiež súhrn ich rozdielov.

Navyše, máme zbierku článkov na hlboký ponor do rôznych nástrojov Commons a Guava.

2. Stručná história dvoch knižníc

Google Guava je projekt spoločnosti Google, vyvinutý hlavne inžiniermi organizácie, aj keď je v súčasnosti využívaný ako open source. The Hlavnou motiváciou pre začatie bolo zahrnutie generík zavedených v JDK 1.5 do Java Collections Frameworkalebo JCF a zvýšiť jeho schopnosť.

Knižnica od svojho vzniku rozšírila svoje možnosti a teraz obsahuje grafy, funkčné programovanie, objekty rozsahu, ukladanie do pamäte cache a String manipulácia.

Apache Commons začínal ako projekt v Jakarte, aby doplnil základné API zbierok Java, a nakoniec sa stal projektom Apache Software Foundation. V priebehu rokov sa rozšíril do rozsiahleho repertoáru opakovane použiteľných komponentov Java v rôznych ďalších oblastiach, vrátane (ale nielen) zobrazovania, I / O, kryptografie, ukladania do pamäte cache, sietí, overovania a združovania objektov.

Pretože sa jedná o projekt typu open-source, vývojári z komunity Apache neustále pridávajú do tejto knižnice, aby rozšírili svoje možnosti. Avšak venujú veľkú pozornosť zachovaniu spätnej kompatibility.

3. Maven závislosť

Ak chcete zahrnúť Guavu, musíme do nej pridať jej závislosť pom.xml:

 com.google.guava guava 29.0-jre 

Informácie o jeho najnovšej verzii nájdete na serveri Maven.

Pre Apache Commons je to trochu iné. V závislosti od nástroja, ktorý chceme použiť, musíme pridať ten konkrétny. Napríklad pre zbierky musíme pridať:

 org.apache.commons commons-collections4 4.4 

V našich ukážkach kódu budeme používať spoločné zbierky4.

Poďme teraz do zábavnej časti!

4. Obojsmerné mapy

Mapy, ku ktorým je možné získať prístup pomocou ich kľúčov, ako aj hodnôt, sú známe ako obojsmerné mapy. Spoločnosť JCF túto funkciu nemá.

Pozrime sa, ako ich naše dve technológie ponúkajú. V obidvoch prípadoch si vezmeme príklad dní v týždni, aby sme získali názov dňa s uvedením jeho počtu a naopak.

4.1. Guava BiMap

Guava ponúka rozhranie - BiMap, ako obojsmerná mapa. Môže byť inštancovaný jednou z jeho implementácií EnumBiMap, EnumHashBiMap, HashBiMapalebo ImmutableBiMap.

Tu používame HashBiMap:

BiMap daysOfWeek = HashBiMap.create ();

Jeho vyplnenie je podobné ako na akejkoľvek mape v Jave:

daysOfWeek.put (1, "pondelok"); daysOfWeek.put (2, "utorok"); daysOfWeek.put (3, "streda"); daysOfWeek.put (4, "štvrtok"); daysOfWeek.put (5, "piatok"); daysOfWeek.put (6, "sobota"); daysOfWeek.put (7, "nedeľa");

A tu je niekoľko testov JUnit, ktoré preukazujú tento koncept:

@Test public void givenBiMap_whenValue_thenKeyReturned () {assertEquals (Integer.valueOf (7), daysOfWeek.inverse (). Get ("nedeľa")); } @Test public void givenBiMap_whenKey_thenValueReturned () {assertEquals ("utorok", daysOfWeek.get (2)); }

4.2. Apache BidiMap

Podobne nám ich poskytuje aj Apache BidiMap rozhranie:

BidiMap daysOfWeek = nový TreeBidiMap ();

Tu používame TreeBidiMap. Existujú však aj ďalšie implementácie, ako napr DualHashBidiMap a DualTreeBidiMap tiež.

Aby sme ju vyplnili, môžeme dať hodnoty ako pre BiMap vyššie.

Jeho použitie je tiež dosť podobné:

@Test public void givenBidiMap_whenValue_thenKeyReturned () {assertEquals (Integer.valueOf (7), daysOfWeek.inverseBidiMap (). Get ("nedeľa")); } @Test public void givenBidiMap_whenKey_thenValueReturned () {assertEquals ("utorok", daysOfWeek.get (2)); }

V niekoľkých jednoduchých testoch výkonu táto obojsmerná mapa zaostával za svojim kolegom z Guavy iba vo vložkách. Bolo to oveľa rýchlejšie pri načítaní kľúčov, ako aj hodnôt.

5. Mapujte kľúče na viac hodnôt

V prípade použitia, keď by sme chceli namapovať viac kľúčov na rôzne hodnoty, napríklad kolekciu nákupného košíka na ovocie a zeleninu, nám tieto dve knižnice ponúkajú jedinečné riešenia.

5.1. Guava MultiMap

Najprv sa pozrime, ako urobiť inštanciu a inicializáciu MultiMap:

Multimap groceryCart = ArrayListMultimap.create (); groceryCart.put ("Ovocie", "Apple"); groceryCart.put ("Ovocie", "Hrozno"); groceryCart.put ("Ovocie", "Jahody"); groceryCart.put ("Zelenina", "Špenát"); groceryCart.put ("Zelenina", "Kapusta");

Potom ho pomocou niekoľkých testov JUnit zobrazíme v akcii:

@Test public void givenMultiValuedMap_whenFruitsFetched_thenFruitsReturned () {List fruits = Arrays.asList ("Apple", "Grapes", "Strawberries"); assertEquals (ovocie, groceryCart.get ("Ovocie")); } @Test public void givenMultiValuedMap_whenVeggiesFetched_thenVeggiesReturned () {List veggies = Arrays.asList ("Špenát", "Kapusta"); assertEquals (veggies, groceryCart.get ("Zelenina")); } 

Navyše, MultiMap nám dáva možnosť odstrániť daný záznam alebo celú sadu hodnôt z mapy:

@Test public void givenMultiValuedMap_whenFuitsRemoved_thenVeggiesPreserved () {assertEquals (5, groceryCart.size ()); groceryCart.remove ("Ovocie", "Apple"); assertEquals (4, groceryCart.size ()); groceryCart.removeAll ("Ovocie"); assertEquals (2, groceryCart.size ()); }

Ako vidíme, tu sme najskôr odstránili Apple z Ovocie nastavená a potom odstránená celá Ovocie nastaviť.

5.2. Apache MultiValuedMap

Opäť začnime s inštanciou a MultiValuedMap:

MultiValuedMap groceryCart = nový ArrayListValuedHashMap ();

Pretože jeho vyplnenie je rovnaké, ako sme videli v predchádzajúcej časti, poďme sa rýchlo pozrieť na využitie:

@Test public void givenMultiValuedMap_whenFruitsFetched_thenFruitsReturned () {List fruits = Arrays.asList ("Apple", "Grapes", "Strawberries"); assertEquals (ovocie, groceryCart.get ("Ovocie")); } @Test public void givenMultiValuedMap_whenVeggiesFetched_thenVeggiesReturned () {List veggies = Arrays.asList ("Špenát", "Kapusta"); assertEquals (veggies, groceryCart.get ("Zelenina")); }

Ako vidíme, jeho použitie je tiež rovnaké!

V tomto prípade však nemáme flexibilitu na odstránenie jedného záznamu, ako napr Apple od Ovocie.Môžeme odstrániť iba celú sadu Ovocie:

@Test public void givenMultiValuedMap_whenFuitsRemoved_thenVeggiesPreserved () {assertEquals (5, groceryCart.size ()); groceryCart.remove ("Ovocie"); assertEquals (2, groceryCart.size ()); }

6. Priraďte viac kľúčov k jednej hodnote

Tu si vezmeme príklad zemepisných šírok a dĺžok, ktoré sa majú mapovať do príslušných miest:

cityCoordinates.put ("40.7128 ° N", "74.0060 ° W", "New York"); cityCoordinates.put ("48.8566 ° N", "2.3522 ° E", "Paríž"); cityCoordinates.put ("19.0760 ° N", "72.8777 ° E", "Mumbai");

Teraz uvidíme, ako to dosiahnuť.

6.1. Guava Tabuľka

Guava ponúka svoje Tabuľka ktorý spĺňa vyššie uvedený prípad použitia:

Tabuľka cityCoordinates = HashBasedTable.create ();

A tu je niekoľko spôsobov použitia, ktoré z toho môžeme odvodiť:

@Test public void givenCoordinatesTable_whenFetched_thenOK () {List expectLongitudes = Arrays.asList ("74.0060 ° W", "2.3522 ° E", "72.8777 ° E"); assertArrayEquals (expectLongitudes.toArray (), cityCoordinates.columnKeySet (). toArray ()); Zoznam očakávaných miest = Arrays.asList ("New York", "Paríž", "Bombaj"); assertArrayEquals (expectCities.toArray (), cityCoordinates.values ​​(). toArray ()); assertTrue (cityCoordinates.rowKeySet (). obsahuje ("48,8566 ° N")); }

Ako vidíme, môžeme získať Nastaviť pohľad na riadky, stĺpce a hodnoty.

Tabuľka tiež nám ponúka možnosť dotazovať sa na jeho riadky alebo stĺpce.

Zoberme do úvahy filmovú tabuľku, ktorá to demonštruje:

Stolové filmy = HashBasedTable.create (); movies.put ("Tom Hanks", "Meg Ryan", "You have Got Mail"); movies.put ("Tom Hanks", "Catherine Zeta-Jones", "The Terminal"); movies.put („Bradley Cooper“, „Lady Gaga“, „Zrodila sa hviezda“); movies.put ("Keenu Reaves", "Sandra Bullock", "Speed"); movies.put ("Tom Hanks", "Sandra Bullock", "Extrémne nahlas a neuveriteľne blízko");

A tu je niekoľko ukážok samozrejmých vyhľadávaní, ktoré môžeme pri našom uskutočňovať filmyTabuľka:

@Test public void givenMoviesTable_whenFetched_thenOK () {assertEquals (3, films.row ("Tom Hanks"). Size ()); assertEquals (2, movies.column ("Sandra Bullock"). size ()); assertEquals („Zrodila sa hviezda“, movies.get („Bradley Cooper“, „Lady Gaga“)); assertTrue (movies.containsValue ("Rýchlosť")); }

Avšak Tabuľka obmedzuje nás na mapovanie iba dvoch kľúčov na hodnotu. Na Guave zatiaľ nemáme alternatívu na mapovanie viac ako dvoch kľúčov na jednu hodnotu.

6.2. Apache MultiKeyMap

Vraciame sa k našim mestské súradnice príkladom je, ako s ním môžeme manipulovať pomocou MultiKeyMap:

@Test public void givenCoordinatesMultiKeyMap_whenQueried_thenOK () {MultiKeyMap cityCoordinates = nový MultiKeyMap (); // vyplniť kľúčmi a hodnotami, ako je uvedené vyššie List expectLongitudes = Arrays.asList ("72.8777 ° E", "2.3522 ° E", "74.0060 ° W"); Zoznam zemepisných dĺžok = new ArrayList (); cityCoordinates.forEach ((kľúč, hodnota) -> {longitudes.add (key.getKey (1));}); assertArrayEquals (expectLongitudes.toArray (), longitudes.toArray ()); Zoznam očakávaných miest = Arrays.asList ("Bombaj", "Paríž", "New York"); Zoznam miest = nový ArrayList (); cityCoordinates.forEach ((kľúč, hodnota) -> {city.add (hodnota);}); assertArrayEquals (expectCities.toArray (), cities.toArray ()); }

Ako vidíme z vyššie uvedeného úryvku kódu, dospieť k rovnakým tvrdeniam ako v prípade Guavy Tabuľka, museli sme iterovať MultiKeyMap.

Avšak MultiKeyMap tiež ponúka možnosť namapovať na hodnotu viac ako dva kľúče. Napríklad nám dáva možnosť mapovať dni v týždni ako všedné dni alebo víkendy:

@Test public void givenDaysMultiKeyMap_whenFetched_thenOK () {days = new MultiKeyMap (); days.put („pondelok“, „utorok“, „streda“, „štvrtok“, „piatok“, „všedný deň“); days.put ("sobota", "nedeľa", "víkend"); assertFalse (days.get ("sobota", "nedeľa"). equals ("všedný deň")); }

7. Zbierky Apache Commons vs. Google Guava

Podľa jeho inžinierov, Google Guava sa zrodil z potreby používať v knižnici všeobecné informácie, ktoré Apache Commons neponúkal. Taktiež dodržiava požiadavky na API pre kolekcie na odpalisku. Ďalšou hlavnou výhodou je, že je v aktívnom vývoji s novými vydaniami, ktoré vychádzajú často.

Apache však ponúka výhodu, pokiaľ ide o výkon pri načítaní hodnoty z kolekcie. Guava však stále trvá koláč, pokiaľ ide o časy vloženia.

Aj keď sme v našich ukážkach kódu porovnávali iba rozhrania API kolekcií, Apache Commons ako celok ponúka oveľa väčšiu škálu funkcií v porovnaní s Guava.

8. Záver

V tomto tutoriáli sme porovnali niektoré z funkcií ponúkaných Apache Commons a Google Guava, konkrétne v oblasti rámca zbierok.

Tu sme iba poškriabali povrch toho, čo tieto dve knižnice ponúkajú.

Navyše to nie je ani porovnanie, ani porovnanie. Ako ukázali naše ukážky kódu, pre každého z nich sú charakteristické vlastnosti a môžu nastať situácie, keď môžu existovať súčasne.

Ako vždy, zdrojový kód je k dispozícii na GitHub.


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