Библиотека Guava для Java; каковы его наиболее полезные и/или скрытые функции

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

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

Ответ 1

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

Некоторые вещи на самом деле не упоминали, что я люблю:

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

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

Ответ 2

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

Части, которые мне особенно нравятся:

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

Ответ 3

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

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

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

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

или

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

Ответ 4

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

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

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

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

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

Ответ 5

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

Ответ 6

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

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

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

Ответ 7

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

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

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

Ответ 8

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