Guava – Kolekcje

Bardzo często używaną przez programistów biblioteką jest Guava – Biblioteka stworzona przez Google. Zawiera wiele mini bibliotek, które w bardzo wielu przypadkach ułatwiają życie.

W ciągu najbliższych kilku tutoriali, skupę się na w miarę dokładnym opisaniu Guavy i pokażę na kilku w miarę prostych przykładach najpopularniejsze elementy tej biblioteki.

Zaczynamy ?

Instalacja

Instalacja jest banalna i wykonywana za pomocą mavena. Dodaj dependency do pom.xml:

 

Guava Kolekcje

Wszyscy znamy stare dobre

Czy można jakoś to uprościć? Okazuje się, że tak !

Guava udostępnia kilka metod statycznych do tworzenia kolekcji

List

Wygląda lepiej? Prosty builder, który zgadnie typ w diamondach, utworzy arrayliste.

Można jeszcze fajniej przy okazji utworzyć listę z elementami…

Set

Oczywiście to samo możemy zrobić z setem..

Map

A może mapa?

 

Multiset

Guava wprowadza też własne implementacje kolekcji

Multiset to nic innego jak set, który może trzymać wiele tych samych instancji tego samego obiektu. Prawie jak lista. Róznica polega na tym, że lista pozwala na trzymanie duplikatów obiektów, ale jest zawsze w jakiś sposób posortowana. Multiset natomiast pozwala trzymać duplikaty obiektów, ale nie gwarantuje w żaden sposób posortowania.

Użycie jest bardzo proste i nawet dodaje kilka fajnych smaczków 🙂

Możemy za jednym zamachem dodać np 10 instancji tego samego obiektu:

I kilka usunąć…

Szybko policzyć ile jest instancji danego obiektu…

I szybko zmienić tą ilość na zupełnie inną…

 Multimap

Kolejnym własnym wymysłem Guavy jest multimap.

Multimap to podobnie jak Multiset zbiór elementów, które są czymś pomiędzy mapą, a kolekcją (np listą).  Przede wszystkim Muplimap pozwala na duplikaty w kluczach 🙂

Oto kilka przykładów:

Utworzyliśmy „mapę”, która też ma klucz:wartość, ale klucz nie jest unikalny. I to jest całe piękno. Aby osiągnąć podobną funkcjonalność za pomocą zwykłej mapy, musielibyśmy jako wartość dać listę, przy dodawaniu elementów musielibyśmy sprawdzać, czy klucz, wartości, już nie istnieją, logika do bani, kto pisał ten wie, że to jest po prostu niewygodne.

Jeśli w jakimś momencie potrzebujemy jednak zrobić z tego mapę, guava daje nam taką możliwość:

dostaniemy piękną mapę jako <String,Collection<String>>, która będzie zawierała wszystko pięknie pogrupowane.

Jeśli chcemy sprawdzić, czy wpis istnieje, po prostu podajemy:

Oczywiście mamy też proste metody do pobrania kluczy, wartości, sprawdzenia czy istnieje klucz, czy istnieje wartość itp. Tylko używać 🙂

BiMap

Czasem mamy taką sytuację, że i klucz i wartości w mapie są unikalne, i chcemy pobrać klucz należący do wartości. Jest to też czasochłonna operacja, musimy pisać logikę sprawdzającą czy wartość istnieje, pobierać klucz i ogólnie jest z tym sporo zabawy. BiMap nam w tym bardzo pomaga

Dzięki metodzie inverse() możemy zamienić mapę w ten sposób, że klucz staje się wartością, a wartość kluczem 🙂

 Table

Tablica. A co, jeśli kluczem są dwie wartości w mapie ? Tworzymy mało czystelną strukturę typu Map<Klucz:Map<Klucz,Wartosc>>. Operacje na tym to już się robi małe piekełko i łatwo o błąd. Guava udostępnia nam tablicę, gdzie mamy dwa klucze, tak jak w tablicy zwykłej, mamy wiersze i kolumny, a wartość jest na przecięciu tych dwóch wartości…

piękne prawda? Pierwsza wartość to wiersz, druga to kolumna, a trzecia to wartość pary wiersz:kolumna

Proste i jakże przydatne !

Immutables

Na koniec bardzo ważna i przydatna właściwość kolekcji guava. Możemy tworzyć kolekcje, które są immutable – to znaczy kolekcje, których nie możemy zmienić! Przydaje się bardzo przy programowaniu funkcyjnym, gdzie z założenia elementy powinny być immutable.

 

Czyli tworzymy listę, która nie może być zmieniona. Proste.

Tak samo możemy robić z setem, multisetem, mapą, multimapą, biMapą …

 

 

 

 

 

 

 

 

 

«
»