Biblioteka Guava: jakie są jej najbardziej przydatne i / lub ukryte funkcje? [Zamknięte]


131

Szybko przeskanowałem Guava API i nowe typy kolekcji, które zapewnia ( Multimapi BiMapna 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?


4
Twój tytuł i pytanie nie pasują do siebie.
aioobe

4
„nowe typy kolekcji… wydają się przydatne” i „Mam powściągliwość w dołączaniu bibliotek… jeśli nie przynoszą one większych korzyści” - a więc o co chodzi? albo uważasz, że biblioteka jest przydatna i przynosi korzyści, albo nie
mat b

1
Od 2017 r. (Pytanie jest teraz zamknięte), jeśli używasz najnowszego Gradle (4.4.1) guawa 21.0 jest dodawany do build.gradle domyślnie jako zależność, ze słowami „Ta zależność jest używana wewnętrznie i nie jest widoczna dla konsumentów na własnej skompilowanej ścieżce klas ”, co sugeruje, że zespół Gradle zdecydował, że jest tam kilka naprawdę wartościowych rzeczy.
mike gryzoń

Odpowiedzi:


158

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:

  • Multimapsą po prostu świetne. Za każdym razem, gdy użyjesz czegoś takiego Map<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, Comparatorktóre zachowują się tak, jak chcesz.
  • Maps.uniqueIndexi Multimaps.index: te metody pobierają an Iterablei a Functioni budują ImmutableMaplub ImmutableListMultimapindeksują wartości w Iterablewyniku 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.
  • Funkcjonalne rzeczy, które zapewnia ... filter, transformitd. Pomimo zawiłości używania klas dla Functions i Predicates, uznałem to za przydatne. Podaję tutaj przykład jednego ze sposobów, aby ładnie to przeczytać .
  • ComparisonChainjest 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).
  • CharMatcherbyły już wspomniane, ale są bardzo potężne.
  • Throwablespozwala zrobić kilka fajnych rzeczy z przedmiotami do rzucania, na przykład Throwables.propagaterzucać rzucanym rzutem, jeśli jest to a RuntimeExceptionlub an, Errori 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.


2
Całkowicie się zgadzam ComparisionChain.
whiskeysierra

44

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

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

  • Charsets.* - takie proste, takie przydatne
  • Kolekcje
  • Obsługa IO (odczyt zasobu w całości w jednej linii itp.)
  • Splitter/Joiner
  • Preconditions

6
Zauważ, że teraz mamy StandardCharsets w Javie 7+. Zastanawiam się, ile innych funkcji Guavy znalazło się w Javie.
DavidS

1
Znalazłem tę wtyczkę Modernizer Maven, która wykrywa użycie starszych interfejsów API, w tym bibliotek innych firm, takich jak Guava. Wydaje się, że plik konfiguracyjny zawiera 67 przestarzałych wersji guawy, w tym StandardCharsets.
DavidS

28

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ć:

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

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");

21

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();

Mam też pytanie na temat guawy ListenableFuture . Jeśli to możliwe, czy możesz przejrzeć mój projekt i pomóc mi wyjaśnić niektóre z moich wątpliwości i jak mam się z nimi uporać? Niedawno zacząłem pracować z Guava ListenableFuture i bardzo mi się podoba, ale mam pewne zamieszanie, jeśli chodzi o ich efektywne wykorzystanie.
John

16

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.


12

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:

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


8

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

  1. Bardzo lubimy Iteratory / Iterable i interfejs funkcji.
  2. Rodzina interfejsów Service to świetne 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 ich zmienić.
  4. Mapy komputerowe (z MapMaker) są wspaniałe w pewnych sytuacjach.

Ogólnie biblioteka jest bardzo wysokiej jakości. API jest dobrze przemyślane, wykonanie solidne. Wysoce rekomendowane.


7

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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.