Guava library for java; jakie są jej najbardziej przydatne i/lub ukryte funkcje [closed]

Przeprowadziłem Szybkie skanowanie Guava API i nowych typów kolekcji, które dostarcza(Multimap i BiMap na przykład wydają się przydatne) i myślę o włączeniu biblioteki do projektu(projektów), nad którym pracuję. Jednak mam również powściągliwość, aby włączyć biblioteki, jeśli nie są one zbytnio korzystne, a poznanie funkcji marnuje cenny czas.

Czy włączyłeś bibliotekę Guava do swojego projektu i czy okazała się przydatna w jakiś nieoczekiwany sposób? Czy zawsze go używasz w przyszłości? Jaka była jego główna korzyść / oszczędność czasu? Jakie są jego ukryte cechy?

 124
Author: Xaerxess, 2010-09-21

8 answers

Poważnie, wszystko w Guava jest przydatne. Używam go od dłuższego czasu i wciąż odkrywam coś nowego, co mogę z nim zrobić, co zajmuje mniej kodu niż ręczne robienie tego.

Niektóre rzeczy, o których inni tak naprawdę nie wspominali, że kocham:

  • Multimap s są po prostu świetne. Za każdym razem, gdy użyjesz czegoś takiego jak Map<Foo, Collection<Bar>>, użyj zamiast tego multimapy i zaoszczędź mnóstwo żmudnego sprawdzania istniejącej kolekcji zmapowanej do klucza oraz tworzenia i dodawania jej, jeśli nie ma.
  • Jest świetny do budowania Comparator S, które zachowują się tak, jak chcesz.
  • Maps.uniqueIndex i Multimaps.index: te metody pobierają Iterable i a Function i budują ImmutableMap lub ImmutableListMultimap, które indeksują wartości w Iterable przez wynik zastosowania funkcji do każdej z nich. Dzięki funkcji, która pobiera ID elementu, możesz indeksować listę elementów według ich ID w jednej linii.
  • rzeczy funkcjonalne, które zapewnia... filter, transform, itd. Pomimo chytrości korzystania z klas dla Functions I PredicateS, uznałem to za przydatne. Podaję przykład jednego ze sposobów, aby to ładnie przeczytać tutaj .
  • ComparisonChain jest małą, łatwą do przeoczenia klasą, która jest przydatna, gdy chcesz napisać metodę porównywania, która porównuje wiele wartości po kolei i powinna powrócić, gdy znajdzie się pierwsza różnica. Usuwa z tego całą nudę, czyniąc z niej tylko kilka linii łańcuchowych wywołań metod.
  • Objects.equal(Object,Object) - null safe równa się.
  • Objects.hashCode(Object...) - łatwy sposób na uzyskanie hasha kod oparty na wielu polach twojej klasy.
  • Objects.firstNonNull(Object,Object) - zmniejsza kod do uzyskania wartości domyślnej, Jeśli pierwsza wartość jest null, zwłaszcza jeśli pierwsza wartość jest wynikiem wywołania metody(musisz przypisać ją do zmiennej przed wykonaniem tego w normalny sposób).
  • Były już wspomniane, ale są bardzo potężne.
  • Throwables pozwala zrobić kilka fajnych rzeczy z throwables, np. Throwables.propagate który ponownie rzuca, jeśli jest to RuntimeException lub Error i owija go w RuntimeException i rzuca, że inaczej.
Mógłbym kontynuować, ale muszę iść do pracy. = ) W każdym razie, pomimo tego, że wymieniłem tutaj Niektóre rzeczy, które lubię, faktem jest, że wszystko w Guava jest przydatne w jakiejś sytuacji lub innej. Wiele z nich jest przydatnych bardzo często. Gdy go używasz, odkryjesz więcej zastosowań. Nie używając go poczujesz się trochę jak posiadanie jednej ręki związanej za plecami.
 154
Author: ColinD,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-09-21 16:34:31

Od kilku lat skutecznie używam guawy w Google - i jest cudownie.

Części, które lubię szczególnie to:

  • Charsets.* - so simple, so useful
  • Kolekcje
  • W ten sposób można uzyskać dostęp do wszystkich zasobów w jednym wierszu.]}
  • Splitter/Joiner
  • Preconditions
 42
Author: Jon Skeet,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-09-21 10:40:30

Początkowo używałem go do stenografii kolekcji. Na przykład zamiast:

Map<String, Map<Long, List<String>>> map = new HashMap<String, Map<Long, List<String>>>();

Możesz to zrobić:

Map<String, Map<Long, List<String>>> map = Maps.newHashMap();

Łatwo jest też wypełniać mapy:

ImmutableMap<String,String> map = ImmutableMap.of("key1", "value1", "key2", "value2");

Teraz odkryłem kilka innych użytecznych narzędzi obecnych w Guava. Na przykład klasa CharMatcher pozwala dopasować sekwencje znaków. Można zrobić:

CharMatcher.inRange('a','z').or(inRange('A','Z'));

Lub

String phoneNumber = CharMatcher.DIGIT.retainFrom("my phone number is 123456789");
 28
Author: dogbane,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-25 17:13:28

Metoda charmatcher 's precomputed () (Źródło) jest miłą "ukrytą cechą", na którą natknąłem się pewnego dnia.

To tak naprawdę tylko optymalizacja, która tworzy tabelę wyszukiwania (używając tablicy bitów), a następnie po prostu wyszukuje znaki, aby sprawdzić, czy "pasują".

Jest to rodzaj ukrytej optymalizacji, którą możesz wykorzystać, gdy używasz biblioteki, której możesz nie myśleć o sobie we własnym kodzie.

Oczywiście, jeśli tworzysz złożony CharMatcher, które planujesz użyć wiele razy, musisz pamiętać, aby wywołać metodę precomputed (), jak:

CharMatcher complexMatcher = CharMatcher.anyOf("cat")
                                        .or(CharMatcher.DIGIT)
                                        .or(CharMatcher.WHITESPACE)
                                        .precomputed();
 21
Author: Etienne Neveu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-09-09 13:22:13

Oto wideo YouTube od Google (prelegent: Kevin Bourrillion, główny inżynier dla podstawowych bibliotek Java Google), który pokazuje piękno kolekcji Google. Jedną z rzeczy, które zrobił Google, która moim zdaniem jest genialna, jest gwarancja niezmienności w kolekcjach.

 16
Author: Buhake Sindi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-13 11:30:22

Google Guava jest biblioteką narzędzi, więc wątpię, że jest w niej zabójcza Klasa. Cała sprawa z użytecznością polega na tym, że prawie używasz jej w każdym projekcie, który masz. Nie pamiętam żadnego projektu, który nie korzystał z Java collection. A prawda jest taka, że użyteczność kolekcji Google Guava jest wspaniała i powinna być w samym Java SDK.

Napisałem trzy artykuły o klasach na Google Guava:

I to nie wszystko, jest wiele innych rzeczy, które możesz zrobić z Guavą.

 12
Author: nanda,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-09-21 10:51:16

Absolutnie bardzo przydatne. To prawie niezmiennie pierwsza biblioteka dodana do nowego projektu.

  1. bardzo lubimy Iteratory/Iterables i interfejs funkcji.
  2. Rodzina interfejsów to wielkie abstrakcje
  3. jesteśmy tak zaangażowani, że zaczęliśmy używać klas ImmutableXXX naszych typów API do komunikowania się, że nie można tego zmienić.
  4. Obliczanie map (od MapMaker) jest wspaniałe w pewnych sytuacjach.

Ogólnie rzecz biorąc, Biblioteka jest bardzo wysokiej jakości. API jest dobrze przemyślane, implementacja solidna. Gorąco polecam.

 8
Author: Darren Gilroy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-09-23 04:01:11

MapMaker oferuje teraz ograniczone pamięci podręczne LRU - to znaczna maszyna ukryta za malutkim API. To ma potencjał ogromnej użyteczności, a ja wciąż jestem na całym kodzie.

 7
Author: Dimitris Andreou,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-09-25 18:40:22