Zbirke Apache Commons vs Google Guava

1. Pregled

U ovom ćemo uputstvu usporediti dvije biblioteke otvorenog koda temeljene na Javi: Apache Commons i Google Guava. Obje knjižnice imaju bogat skup značajki s puno korisnih API-ja, uglavnom u zbirkama i na I / O području.

Radi kratkoće, ovdje ćemo opisati samo nekoliko najčešće korištenih iz okvira zbirki zajedno s uzorcima koda. Vidjet ćemo i sažetak njihovih razlika.

Dodatno, imamo zbirku članaka za dublje zarobljavanje u razne zajedničke proizvode i uslužne programe tvrtke Guava.

2. Kratka povijest dviju knjižnica

Google Guava je Googleov projekt, koji su uglavnom razvili inženjeri organizacije, iako je sada otvoren. The glavni motiv za početak bilo je uključivanje generičkih lijekova predstavljenih u JDK 1.5 u Java Collections Framework, ili JCF, i poboljšati njegovu sposobnost.

Od svog osnivanja knjižnica je proširila svoje mogućnosti i sada uključuje grafikone, funkcionalno programiranje, objekte raspona, predmemoriranje i Niz manipulacija.

Apache Commons započeo je kao projekt u Džakarti kao dodatak osnovnom API-ju Java zbirki, a na kraju je postao projekt Apache Software Foundation. Tijekom godina proširio se na golem repertoar Java komponenata za višekratnu upotrebu u raznim drugim područjima, uključujući (ali ne ograničavajući se na) slike, I / O, kriptografiju, predmemoriranje, umrežavanje, provjeru valjanosti i udruživanje objekata.

Budući da je ovo projekt otvorenog koda, programeri iz zajednice Apache nastavljaju dodavati u ovu knjižnicu kako bi proširili svoje mogućnosti. Međutim, vode veliku brigu o održavanju povratne kompatibilnosti.

3. Ovisnost Mavena

Da bismo uključili Guavu, moramo dodati njezinu ovisnost o našoj pom.xml:

 com.google.guava guava 29,0-jre 

Informacije o najnovijoj verziji možete pronaći na Mavenu.

Za Apache Commons to je malo drugačije. Ovisno o uslužnom programu koji želimo koristiti, moramo dodati upravo taj. Na primjer, za zbirke moramo dodati:

 org.apache.commons commons-collection4 4.4 

U našim ćemo uzorcima koda koristiti zajedničke zbirke4.

Krenimo sada u zabavni dio!

4. Dvosmjerne karte

Karte kojima se može pristupiti pomoću njihovih ključeva, kao i vrijednosti, poznate su kao dvosmjerne karte. JCF nema ovu značajku.

Pogledajmo kako ih nude naše dvije tehnologije. U oba slučaja uzet ćemo primjer dana u tjednu kako bismo dobili naziv dana s obzirom na njegov broj i obrnuto.

4.1. Guava BiMap

Guava nudi sučelje - BiMap, kao dvosmjerna karta. Može se instancirati s jednom od njegovih implementacija EnumBiMap, EnumHashBiMap, HashBiMap, ili ImmutableBiMap.

Ovdje koristimo HashBiMap:

BiMap daysOfWeek = HashBiMap.create ();

Naseljavanje je slično bilo kojoj karti u Javi:

daysOfWeek.put (1, "ponedjeljak"); daysOfWeek.put (2, "utorak"); daysOfWeek.put (3, "srijeda"); daysOfWeek.put (4, "četvrtak"); daysOfWeek.put (5, "petak"); daysOfWeek.put (6, "Subota"); daysOfWeek.put (7, "Nedjelja");

Evo nekoliko JUnit testova koji dokazuju koncept:

@Test javna praznina givenBiMap_whenValue_thenKeyReturned () {assertEquals (Integer.valueOf (7), daysOfWeek.inverse (). Get ("Sunday")); } @Test javna praznina givenBiMap_whenKey_thenValueReturned () {assertEquals ("Utorak", daysOfWeek.get (2)); }

4.2. Apacheov BidiMap

Slično tome, Apache nam pruža svoje BidiMap sučelje:

BidiMap daysOfWeek = novo TreeBidiMap ();

Ovdje koristimo TreeBidiMap. Međutim, postoje i druge implementacije, poput DualHashBidiMap i DualTreeBidiMap također.

Da bismo ga popunili, možemo staviti vrijednosti kao i za BiMap iznad.

Njegova je upotreba također prilično slična:

@Test javna praznina givenBidiMap_whenValue_thenKeyReturned () {assertEquals (Integer.valueOf (7), daysOfWeek.inverseBidiMap (). Get ("Sunday")); } @Test javna praznina givenBidiMap_whenKey_thenValueReturned () {assertEquals ("Utorak", daysOfWeek.get (2)); }

U nekoliko jednostavnih testova izvedbe, ova dvosmjerna karta zaostajao je za kolegom iz Guave samo umetanjem. Puno je brže bilo dohvaćanja tipki kao i vrijednosti.

5. Mapiranje ključeva u više vrijednosti

Za slučaj upotrebe u kojem bismo željeli mapirati više ključeva u različite vrijednosti, poput zbirke košarice s namirnicama za voće i povrće, dvije knjižnice nude nam jedinstvena rješenja.

5.1. Guava MultiMap

Prvo, da vidimo kako instancirati i inicijalizirati MultiMap:

Multimap groceryCart = ArrayListMultimap.create (); groceryCart.put ("Voće", "Jabuka"); groceryCart.put ("Voće", "Grožđe"); groceryCart.put ("Voće", "Jagode"); groceryCart.put ("Povrće", "Špinat"); groceryCart.put ("Povrće", "Kupus");

Zatim ćemo upotrijebiti nekoliko JUnit testova da bismo ga vidjeli na djelu:

@Test javna praznina givenMultiValuedMap_whenFruitsFetched_thenFruitsReturned () {Popis voća = Arrays.asList ("Apple", "Grožđe", "Jagode"); assertEquals (voće, groceryCart.get ("Voće")); } @Test javna praznina givenMultiValuedMap_whenVeggiesFetched_thenVeggiesReturned () {Popis povrća = Arrays.asList ("Špinat", "Kupus"); assertEquals (povrće, groceryCart.get ("Povrće")); } 

Dodatno, MultiMap daje nam mogućnost uklanjanja zadanog unosa ili cijelog skupa vrijednosti s karte:

@Test javna praznina givenMultiValuedMap_whenFuitsRemoved_thenVeggiesPreserved () {assertEquals (5, groceryCart.size ()); groceryCart.remove ("Voće", "Jabuka"); assertEquals (4, groceryCart.size ()); groceryCart.removeAll ("Voće"); assertEquals (2, groceryCart.size ()); }

Kao što vidimo, ovdje smo prvo uklonili Jabuka od Voće postavili, a zatim uklonili cijelu Voće postavljen.

5.2. Apacheov MultiValuedMap

Ponovimo, krenimo s instanciranjem a MultiValuedMap:

MultiValuedMap groceryCart = novi ArrayListValuedHashMap ();

Budući da je popunjavanje isto kao što smo vidjeli u prethodnom odjeljku, pogledajmo brzo upotrebu:

@Test javna praznina givenMultiValuedMap_whenFruitsFetched_thenFruitsReturned () {Popis voća = Arrays.asList ("Jabuka", "Grožđe", "Jagode"); assertEquals (voće, groceryCart.get ("Voće")); } @Test javna praznina givenMultiValuedMap_whenVeggiesFetched_thenVeggiesReturned () {Popis povrća = Arrays.asList ("Špinat", "Kupus"); assertEquals (povrće, groceryCart.get ("Povrće")); }

Kao što vidimo, i njegova je upotreba ista!

Međutim, u ovom slučaju nemamo fleksibilnosti za uklanjanje niti jednog unosa, kao što je Jabuka iz Voće.Možemo ukloniti samo cijeli skup Voće:

@Test javna praznina givenMultiValuedMap_whenFuitsRemoved_thenVeggiesPreserved () {assertEquals (5, groceryCart.size ()); groceryCart.remove ("Voće"); assertEquals (2, groceryCart.size ()); }

6. Mapirajte više tipki u jednu vrijednost

Ovdje ćemo uzeti primjer geografskih širina i dužina koje se mapiraju u pojedine gradove:

cityCoordinates.put ("40.7128 ° S", "74.0060 ° Z", "New York"); cityCoordinates.put ("48.8566 ° S", "2.3522 ° I", "Pariz"); cityCoordinates.put ("19.0760 ° S", "72.8777 ° I", "Mumbai");

Sad ćemo vidjeti kako to postići.

6.1. Guava Stol

Guava nudi svoje Stol koji zadovoljava gornji slučaj upotrebe:

Tablica cityCoordinate = HashBasedTable.create ();

Evo nekoliko navika koje iz toga možemo izvesti:

@Test javna praznina givenCoordinatesTable_whenFetched_thenOK () {Popis očekivanih dužina = Nizova.asList ("74,0060 ° Z", "2,33522 ° I", "72,8777 ° I"); assertArrayEquals (očekuje se Longitude.toArray (), cityCoordinates.columnKeySet (). toArray ()); Popis očekivanih gradova = Arrays.asList ("New York", "Paris", "Mumbai"); assertArrayEquals (očekivaniCities.toArray (), cityCoordinates.values ​​(). toArray ()); assertTrue (cityCoordinates.rowKeySet (). sadrži ("48,8566 ° S")); }

Kao što vidimo, možemo dobiti a Postavi prikaz redaka, stupaca i vrijednosti.

Stol također nam nudi mogućnost ispitivanja njegovih redaka ili stupaca.

Razmotrimo filmski stol kako bismo to demonstrirali:

Filmovi u tablici = HashBasedTable.create (); movies.put ("Tom Hanks", "Meg Ryan", "Dobila si poštu"); movies.put ("Tom Hanks", "Catherine Zeta-Jones", "Terminal"); movies.put ("Bradley Cooper", "Lady Gaga", "Rođena je zvijezda"); movies.put ("Keenu Reaves", "Sandra Bullock", "Speed"); movies.put ("Tom Hanks", "Sandra Bullock", "Izuzetno glasno i nevjerojatno blizu");

I evo nekoliko primjera pretraživanja koja sami sebe objašnjavaju i koja možemo obaviti na vlastitom pretraživanju filmoviStol:

@Test javna praznina givenMoviesTable_whenFetched_thenOK () {assertEquals (3, movies.row ("Tom Hanks"). Size ()); assertEquals (2, movies.column ("Sandra Bullock"). size ()); assertEquals ("Rođena je zvijezda", movies.get ("Bradley Cooper", "Lady Gaga")); assertTrue (movies.containsValue ("Speed")); }

Međutim, Stol ograničava nas na mapiranje samo dva ključa na vrijednost. Još nemamo alternativu u Guavi za mapiranje više od dva ključa u jednu vrijednost.

6.2. Apacheov MultiKeyMap

Vraćajući se našem cityCoordinate na primjer, evo kako njime možemo manipulirati pomoću MultiKeyMap:

@Test javna praznina givenCoordinatesMultiKeyMap_whenQueried_thenOK () {MultiKeyMap cityCoordinate = nova MultiKeyMap (); // popunjavamo ključevima i vrijednostima kao što je prethodno prikazano Popis očekivanih dužina = Nizova.asList ("72,8777 ° E", "2,33522 ° E", "74,0060 ° Z"); Navesti dužine = novi ArrayList (); cityCoordinates.forEach ((ključ, vrijednost) -> {longitudes.add (key.getKey (1));}); assertArrayEquals (očekuje se Longitude.toArray (), longitudes.toArray ()); Popis očekivanih gradova = Arrays.asList ("Mumbai", "Pariz", "New York"); Popis gradova = novi ArrayList (); cityCoordinates.forEach ((ključ, vrijednost) -> {cities.add (vrijednost);}); assertArrayEquals (očekivaniCities.toArray (), cities.toArray ()); }

Kao što vidimo iz gornjeg isječka koda, doći do istih tvrdnji kao i za Guavine Stol, morali smo ponoviti MultiKeyMap.

Međutim, MultiKeyMap također nudi mogućnost mapiranja više od dva ključa u vrijednost. Na primjer, daje nam mogućnost mapiranja dana u tjednu kao radnih dana ili vikenda:

@Test javna praznina givenDaysMultiKeyMap_whenFetched_thenOK () {days = new MultiKeyMap (); days.put ("Ponedjeljak", "Utorak", "Srijeda", "Četvrtak", "Petak", "Radni dan"); days.put ("subota", "nedjelja", "vikend"); assertFalse (days.get ("Subota", "Nedjelja"). jednako ("Dan u tjednu")); }

7. Apache Commons Collections u odnosu na Google Guava

Prema svojim inženjerima, Google Guava nastao je iz potrebe za korištenjem generičkih lijekova u knjižnici, što Apache Commons nije ponudio. Također slijedi zahtjeve API-ja za zbirke prema tee. Druga velika prednost je što se aktivno razvija, a nova izdanja izlaze često.

Međutim, Apache nudi prednost kada je u pitanju izvedba dok dohvaća vrijednost iz kolekcije. Guava ipak uzima tortu, što se tiče vremena umetanja.

Iako smo u uzorcima koda uspoređivali samo API-je zbirki, Apache Commons u cjelini nudi puno veću paletu značajki u usporedbi s Guavom.

8. Zaključak

U ovom uputstvu usporedili smo neke funkcije koje nude Apache Commons i Google Guava, posebno na području okvira zbirki.

Ovdje smo samo ogrebali površinu onoga što dvije knjižnice nude.

Štoviše, to nije ili-ili usporedba. Kao što su pokazali naši uzorci koda, postoje značajke jedinstvene za svako od njih dvoje, a mogu biti situacije u kojima oboje mogu koegzistirati.

Kao i uvijek, izvorni kod dostupan je na GitHub-u.


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