Szybko przeskanowałem Guava API i nowe typy kolekcji, które zapewnia ( Multimap
i BiMap
na przykład wydają się przydatne) i myślę o włączeniu biblioteki do projektów, nad którymi pracuję.
Jednak mam też niechęć do włączania bibliotek chcąc nie chcąc, jeśli nie przynoszą one większych korzyści, a poznanie ich funkcji marnuje cenny czas.
Czy włączyłeś bibliotekę Guava do swojego projektu i czy okazała się użyteczna w jakiś nieoczekiwany sposób? Czy zawsze używałbyś go w przyszłości? Jaka jest jego główna korzyść / oszczędność czasu? Jakie są jego ukryte cechy?
Odpowiedzi:
Poważnie, wszystko w guawie jest przydatne. Używam go od dłuższego czasu i wciąż odkrywam coś nowego, co mogę z nim zrobić, co wymaga mniej kodu niż zrobienie tego ręcznie.
Niektóre rzeczy, o których inni tak naprawdę nie wspomnieli, a które kocham:
Multimap
są po prostu świetne. Za każdym razem, gdy użyjesz czegoś takiegoMap<Foo, Collection<Bar>>
, użyj multimapy i zaoszczędź sobie mnóstwa żmudnego sprawdzania istniejącej kolekcji mapowanej na klucz oraz tworzenia i dodawania jej, jeśli jej nie ma.Ordering
świetnie nadaje się do budynków,Comparator
które zachowują się tak, jak chcesz.Maps.uniqueIndex
iMultimaps.index
: te metody pobierają anIterable
i aFunction
i budująImmutableMap
lubImmutableListMultimap
indeksują wartości wIterable
wyniku zastosowania funkcji do każdego z nich. Dzięki funkcji, która pobiera identyfikator elementu, możesz indeksować listę elementów według ich identyfikatora w jednej linii.filter
,transform
itd. Pomimo zawiłości używania klas dlaFunction
s iPredicate
s, uznałem to za przydatne. Podaję tutaj przykład jednego ze sposobów, aby ładnie to przeczytać .ComparisonChain
jest małą, łatwo przeoczoną klasą, która jest przydatna, gdy chcesz napisać metodę porównawczą, która porównuje wiele wartości po kolei i powinna zwracać, gdy zostanie znaleziona pierwsza różnica. Usuwa całą nudę, czyniąc z niej tylko kilka wierszy połączonych wywołań metod.Objects.equal(Object,Object)
- Null safe równa się.Objects.hashCode(Object...)
- łatwy sposób na uzyskanie kodu skrótu na podstawie wielu pól Twojej klasy.Objects.firstNonNull(Object,Object)
- redukuje kod w celu uzyskania wartości domyślnej, jeśli pierwsza wartość jest pusta, szczególnie jeśli pierwsza wartość jest wynikiem wywołania metody (przed zrobieniem tego w normalny sposób trzeba by przypisać ją do zmiennej).CharMatcher
były już wspomniane, ale są bardzo potężne.Throwables
pozwala zrobić kilka fajnych rzeczy z przedmiotami do rzucania, na przykładThrowables.propagate
rzucać rzucanym rzutem, jeśli jest to aRuntimeException
lub an,Error
i zawijać go w a, a w przeciwnym razie wyrzucaćRuntimeException
.Z pewnością mógłbym kontynuować, ale muszę zabrać się do pracy. =) W każdym razie, mimo że wymieniłem tutaj kilka rzeczy, które lubię, faktem jest, że wszystko w guawie jest przydatne w takiej czy innej sytuacji. Wiele z nich jest przydatnych bardzo często. Używając go, odkryjesz więcej zastosowań. Nieużywanie go będzie trochę przypominało trzymanie jednej ręki związanej za plecami.
źródło
ComparisionChain
.Od kilku lat skutecznie używam guawy w Google - i jest cudownie.
Części, które szczególnie lubię, to:
Charsets.*
- takie proste, takie przydatneSplitter
/Joiner
Preconditions
źródło
Początkowo użyłem go do zbiorów stenogramów. Na przykład zamiast:
Map<String, Map<Long, List<String>>> map = new HashMap<String, Map<Long, List<String>>>();
możesz to zrobić:
Mapy można również łatwo wypełnić:
ImmutableMap<String,String> map = ImmutableMap.of("key1", "value1", "key2", "value2");
Teraz odkryłem kilka innych przydatnych narzędzi obecnych w guawie. Na przykład klasa CharMatcher umożliwia dopasowywanie sekwencji znaków. Możesz to zrobić:
CharMatcher.inRange('a','z').or(inRange('A','Z'));
lub
String phoneNumber = CharMatcher.DIGIT.retainFrom("my phone number is 123456789");
źródło
Metoda precomputed () ( źródło ) CharMatchera jest przyjemną „ukrytą funkcją”, na którą natknąłem się pewnego dnia.
Tak naprawdę jest to tylko optymalizacja, która tworzy tabelę przeglądową (używając tablicy bitów), a następnie po prostu wyszukuje znaki, aby sprawdzić, czy pasują.
Jest to rodzaj ukrytej optymalizacji, której możesz użyć podczas korzystania z biblioteki, o której być może nie pomyślałeś w swoim własnym kodzie.
Oczywiście, jeśli tworzysz złożony CharMatcher, którego planujesz używać wielokrotnie, musisz pamiętać o wywołaniu metody precomputed (), takiej jak:
CharMatcher complexMatcher = CharMatcher.anyOf("cat") .or(CharMatcher.DIGIT) .or(CharMatcher.WHITESPACE) .precomputed();
źródło
Oto film YouTube od Google (mówca: Kevin Bourrillion, główny inżynier w podstawowych bibliotekach Java w Google), który pokazuje piękno kolekcji Google. Jedną z rzeczy, które zrobiła Google, która moim zdaniem jest genialna, jest zagwarantowanie niezmienności kolekcji.
źródło
Google Guava to biblioteka narzędzi, więc wątpię, czy jest w niej jakaś zabójcza klasa. Cała rzecz dotycząca użyteczności polega na tym, że prawie używasz jej w każdym swoim projekcie. Nie pamiętam żadnego projektu, który zrobiłem, który nie używa kolekcji Java. I prawda jest taka, że narzędzie Google Guava do zbierania danych jest wspaniałe i powinno znajdować się w samym Java SDK.
Napisałem trzy artykuły o zajęciach w Google Guava:
CheckedFuture
: http://blog.firdau.si/2010/07/07/guava-using-checkedfuture/ListenableFuture
: http://blog.firdau.si/2010/07/05/guava-using-listenablefuture/ComputingMap
w Google Collection (obecnie Guava) http://blog.firdau.si/2009/11/13/computing-map-on-google-collections/A to nie wszystko, jest wiele innych rzeczy, które możesz zrobić z guawą.
źródło
Absolutnie bardzo przydatne. To prawie zawsze pierwsza biblioteka dodana do nowego projektu.
Ogólnie biblioteka jest bardzo wysokiej jakości. API jest dobrze przemyślane, wykonanie solidne. Wysoce rekomendowane.
źródło
MapMaker oferuje teraz ograniczone pamięci podręczne LRU - to pewna istotna maszyna ukryta za małym API. Ma to potencjał do ogromnej użyteczności, a ja wciąż jestem nad kodem.
źródło