2010-09-21 2 views
122

У меня было быстрое сканирование Guava API и новые типы коллекций, которые он предоставляет (например, Multimap и BiMap), и я думаю о включении библиотеки в проект) Я работаю на. Тем не менее, у меня также есть сдержанность, чтобы включать библиотеки волей-неволей, если они не имеют большой пользы, и изучение особенностей тратит драгоценное время.Библиотека Guava для java; какие его наиболее полезные и/или скрытые функции

Вы включили библиотеку Guava в свой проект, и она оказалась полезной каким-либо неожиданным способом? Вы всегда будете использовать его в будущем? Какова была его основная польза/экономия времени? Каковы его скрытые функции?

+4

Ваше название и ваш вопрос в действительности не совпадают. – aioobe

+4

«новые типы коллекций ... кажутся полезными» и «У меня есть сдержанность, чтобы включать библиотеки ... если они не имеют большой пользы» - хорошо, что это такое? вы считаете, что библиотека полезна и имеет выгоду, или вы не используете –

+0

Начиная с 2017 года (вопрос закрыт), если вы используете последний Gradle (4.4.1), guava 21.0 добавляется к build.gradle по умолчанию в качестве зависимости , со словами «Эта зависимость используется внутренне и не подвергается потребителям по собственному пути к компиляции классов», что говорит о том, что команда «Грейдл» решила, что там есть действительно ценные вещи. –

ответ

152

Серьезно, все в гуавы полезно. Я использую его довольно долгое время, и я все еще всегда открываю что-то новое, что я могу сделать с ним, что делает меньше кода, чем делает это вручную.

Некоторые вещи другие не действительно говорил, что я люблю:

  • Multimap s просто замечательно. Каждый раз, когда вы будете использовать что-то вроде Map<Foo, Collection<Bar>>, вместо этого используйте multimap и сохраните себе тонну утомительной проверки существующей коллекции, сопоставленной с ключом, и создайте и добавьте ее, если ее там нет.
  • Ordering отлично подходит для строительства Comparator s, которые ведут себя именно так, как вы хотите.
  • Maps.uniqueIndex и Multimaps.index: эти методы принимают Iterable и Function и построить ImmutableMap или ImmutableListMultimap, что индексы значения в Iterable в результате применения функции к каждому. Таким образом, с функцией, которая возвращает идентификатор элемента, вы можете индексировать список элементов по их идентификатору в одной строке.
  • Функциональный материал, который он предоставляет ... filter, transform и т. Д. Несмотря на многословие использования классов для Function s и Predicate, я нашел это полезным. Я приведу пример одного из способов сделать это хорошо прочитанным here.
  • ComparisonChain - небольшой, легко упускаемый класс, который полезен, когда вы хотите написать метод сравнения, который последовательно сравнивает несколько значений и должен возвращаться при обнаружении первой разницы. Он удаляет всю скуку, делая это всего лишь несколькими линиями цепочечных вызовов.
  • Objects.equal(Object,Object) - null сейф соответствует.
  • Objects.hashCode(Object...) - простой способ получить хеш-код на основе нескольких полей вашего класса.
  • Objects.firstNonNull(Object,Object) - уменьшает код для получения значения по умолчанию, если первое значение равно null, особенно если первое значение является результатом вызова метода (вам придется назначить его переменной, прежде чем делать это обычным способом) ,
  • CharMatcher s уже упоминалось, но они очень мощные.
  • Throwables позволяет сделать некоторые интересные вещи с throwables, такие как Throwables.propagate, который rethrows в метательного если это RuntimeException или Error и оборачивает его в RuntimeException и броски, которые в противном случае.

Я мог бы конечно продолжать, но мне нужно работать. =) Во всяком случае, несмотря на то, что я перечислил некоторые вещи, которые мне здесь нравятся, дело в том, что все в Гуаве полезно в той или иной ситуации. Многое из этого полезно очень часто. Когда вы его используете, вы обнаружите больше применений. Не использовать его будет немного похоже на то, чтобы одна рука была привязана за спиной.

+2

Полностью согласен с 'ComparisionChain'. – whiskeysierra

42

Я эффективно использовал Guava в течение нескольких лет, внутри Google - и это замечательно.

Части я в особенно любят являются:

  • Charsets.* - так просто, полезно
  • Коллекции обработки
  • IO (читать ресурс полностью в одной строке, и т.д.)
  • Splitter/Joiner
  • Preconditions
+5

Обратите внимание, что теперь у нас есть [StandardCharsets] (https://docs.oracle.com/javase/7/docs/api/java/nio/charset/StandardCharsets.html) в Java 7+. Интересно, как многие другие функции Guava нашли свой путь в Java. – DavidS

+0

Я нашел это [Модернизатор Maven Plugin] (https://github.com/andrewgaul/modernizer-maven-plugin), который обнаруживает использование устаревших API, включая сторонние библиотеки, такие как Guava. [Файл конфигурации] (https://github.com/andrewgaul/modernizer-maven-plugin/blob/master/src/main/resources/modernizer.xml), как представляется, содержит 67 отказов Guava, включая StandardCharsets. – DavidS

12

Google Guava - это служебная библиотека, поэтому я сомневаюсь, что внутри нее есть класс убийцы. Все, что касается утилиты, вы почти используете, что в каждом проекте у вас есть. Я не могу вспомнить ни один проект, который я сделал, который не использует коллекцию Java. И правда в том, что утилита сбора данных Google Guava замечательна и должна быть в самом SDK Java.

Я написал три статьи о классах на Google гуавы:

И это еще не все, есть много других вещей, которые вы можете сделать w с Гуавой.

16

Вот YouTube video от Google (докладчик: Кевин Бурриллион, ведущий инженер для основных Java-библиотек Google), который показывает красоту коллекций Google. Одна вещь, которую сделал Google, которая, я считаю, блестящая, - Гарантия Неизбежность в коллекциях.

27

Первоначально я использовал его для коллекций сокращений.Например, вместо:

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

вы можете сделать это:

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

Это также легко для заполнения карты:

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

Теперь, я обнаружил некоторые другие полезные утилиты присутствуют в гуавы. Например, класс CharMatcher позволяет сопоставлять последовательности символов. Вы можете сделать:

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

или

String phoneNumber = CharMatcher.DIGIT.retainFrom("my phone number is 123456789"); 
21

Предварительно вычисленный метод (source) CharMatcher - прекрасная «скрытая функция». Я наткнулся на другой день.

Это действительно просто оптимизация, которая создает таблицу поиска (используя бит-массив), а затем просто ищет символы, чтобы увидеть, соответствуют ли они.

Это скрытая оптимизация, которую вы можете использовать при использовании библиотеки, о которой вы, возможно, не подумали о себе в своем собственном коде.

Конечно, если вы создаете сложный CharMatcher, который вы планируете использовать много раз, вы должны помнить, чтобы вызвать метод предварительно вычисленный(), например:

CharMatcher complexMatcher = CharMatcher.anyOf("cat") 
             .or(CharMatcher.DIGIT) 
             .or(CharMatcher.WHITESPACE) 
             .precomputed(); 
+0

У меня также есть вопрос о guava [ListenableFuture] (http://stackoverflow.com/questions/29336280/how-to-properly-deal-with-exceptions-coming-from-listenablefuture-guava).Если возможно, вы можете просмотреть мой дизайн и помочь мне прояснить некоторые из моих сомнений и как я должен иметь дело с ними? Недавно я начал работать с Guava ListenableFuture, и мне очень нравится, но у меня есть путаница в том, как эффективно их использовать. – john

8

Абсолютно очень супер полезно. Почти всегда первая библиотека добавлена ​​в новый проект.

  1. Мы очень любим Iterators/Iterables и интерфейс Function.
  2. Сервисное семейство интерфейсов - отличные абстракции
  3. Мы так привержены, что начали использовать классы ImmutableXXX для наших типов API, чтобы сообщить, что они не могут быть изменены.
  4. Вычисление карт (от MapMaker) замечательно в определенных ситуациях.

В целом, библиотека очень высокого качества. API хорошо продуман, реализация твердая. Настоятельно рекомендуется.

7

MapMaker теперь предлагает ограниченные кеши LRU - это некоторые существенные механизмы, скрытые за крошечным API. У этого есть потенциал для огромной утилиты, и я все еще на всем протяжении кода.

 Смежные вопросы

  • Нет связанных вопросов^_^