Библиотека Guava: каковы ее самые полезные и / или скрытые функции? [закрыто]

131

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

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

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

ним чимпский
источник
4
Ваш заголовок и ваш вопрос не совпадают.
aioobe
4
«новые типы коллекций ... кажутся полезными» и «я не хочу включать библиотеки ... если они не принесут большой пользы» - ну что же тогда? вы либо думаете, что библиотека полезна и приносит пользу, либо нет
matt b
1
По состоянию на 2017 год (вопрос закрыт), если вы используете последнюю версию Gradle (4.4.1), guava 21.0 добавляется в build.gradle по умолчанию в качестве зависимости со словами «Эта зависимость используется внутри компании и не предоставляется потребителям. на их собственный путь к классам компиляции ", предполагая, что команда Gradle решила, что там есть действительно ценные вещи.
mike rodent

Ответы:

158

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

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

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

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

ColinD
источник
2
Полностью согласен ComparisionChain.
вискиьерра,
44

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

Мне особенно нравятся следующие части:

  • Charsets.* - так просто, так полезно
  • Коллекции
  • Обработка ввода-вывода (полностью прочитать ресурс в одной строке и т. Д.)
  • Splitter/Joiner
  • Preconditions
Джон Скит
источник
6
Обратите внимание, что теперь у нас есть StandardCharsets в Java 7+. Интересно, сколько других функций Guava нашли отражение в Java.
DavidS
1
Я нашел этот плагин Modernizer Maven, который обнаруживает использование устаревших API, включая сторонние библиотеки, такие как Guava. В файле конфигурации содержится 67 устаревших версий Guava, включая StandardCharsets.
DavidS 01
28

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

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");
кендырь
источник
21

Метод precomputed () ( источник ) CharMatcher - это хорошая «скрытая функция», на которую я наткнулся на днях.

На самом деле это просто оптимизация, которая создает таблицу поиска (с использованием битового массива), а затем просто ищет символы, чтобы увидеть, «совпадают ли они».

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

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

CharMatcher complexMatcher = CharMatcher.anyOf("cat")
                                        .or(CharMatcher.DIGIT)
                                        .or(CharMatcher.WHITESPACE)
                                        .precomputed();
Этьен Невё
источник
У меня также есть вопрос по гуаве ListenableFuture . Если возможно, вы можете просмотреть мой дизайн и помочь мне прояснить некоторые из моих сомнений и как мне с ними бороться? Недавно я начал работать с Guava ListenableFuture, и мне многое нравится, но я не понимаю, как их эффективно использовать.
Джон
16

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

Бухаке синди
источник
12

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

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

И это еще не все, есть еще много всего, что вы можете делать с помощью Guava.

нанда
источник
8

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

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

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

Даррен Гилрой
источник
7

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

Димитрис Андреу
источник