Статьи

Google Guava: 5 вещей, которые вы никогда не знали, что могли бы сделать

Каковы некоторые из менее известных функций Google Guava, которые может использовать каждый разработчик?

Это одна из самых популярных библиотек, с открытым исходным кодом, вы, наверное, уже знаете, и это происходит из того места, где люди играют в квиддич как настоящий спорт (по крайней мере, в Internship ). Это не библиотека Хогвартса от Гарри Поттера, но в ней есть множество заклинаний: Google Guava содержит ряд базовых библиотек Java, которые были созданы внутри Google, испытаны в боевых условиях на производстве и публично выпущены. И это также было необязательным, прежде чем он появился на Java 8.

Основным направлением работы Guava является улучшение рабочего процесса вокруг общих задач с помощью утилит, которые помогают писать лучше, более чистый код и быть более продуктивными. Наиболее известный своими коллекциями и возможностями кэширования, он содержит много полезных, но малоизвестных функций. Для коллекций и кеширования он представил улучшения API коллекции JDKs и заполнил пустоту отсутствующего ( пока долгожданного ) JCache, который был наконец выпущен в прошлом году . В этом посте я хотел бы поделиться с вами некоторыми функциями Google Guava, которые мы хотели бы использовать здесь, в Такипи, и некоторыми более интересными открытиями, которые мы только что сделали.

Примечание: Guava поддерживает Java 6 и выше.

1. Неподписанные примитивы: они существуют!

Одной из менее известных функций Java 8 является новый обходной путь для неподписанных примитивов в классе Integer. Еще менее известной особенностью Guava является то, что все это уже было доступно за годы до выпуска Java 8 и может быть использовано сегодня для Java 6 и выше. Давайте посмотрим, как это обрабатывается в Гуаве. У нас есть 2 варианта, и мы должны оставаться последовательными:

Имея дело с примитивным типом непосредственно как int, и помним, что в нашей логике это не подписано:

1
2
3
int notReallyInt = UnsignedInts.parseUnsignedInt(4294967295); // Max unsigned int
 
String maxUnsigned = UnsignedInts.toString(notReallyInt); // We’re legit!

UnsignedInts и UnsignedLongs также поддерживают такие методы, как сравнение, деление, минимальное, максимальное и другое.

Оболочка, чтобы избежать непосредственного обращения с примитивами и вызвать ошибки:

1
2
3
UnsignedInteger newType = UnsignedInteger.valueOf(maxUnsigned);
 
newType = newType.plus(UnsignedInteger.valueOf("1")); // Increment

UnsignedInteger и UnsignedLong также поддерживают такие методы, как minus, times, splitBy и mod.

2. Хеширование: 128-битный MurmurHash за победу

При рассмотрении возможностей некриптографического хеширования, которые мы получаем со стандартной библиотекой Java, нам действительно не хватает одного — MurmurHash . Это просто, быстро, распределяется равномерно и имеет отличную поддержку на многих языках. Не для замены Java hashCode (), но отлично, если вам нужно сгенерировать много хешей, когда 32-битного недостаточно, и вам нужно сделать это очень быстро, без ущерба для производительности. Вот как это происходит на Гуаве:

1
2
3
4
5
6
HashFunction hf = Hashing.murmur3_128(); // 32bit version available as well
HashCode hc = hf.newHasher()
   .putLong(id)
   .putString(name, Charsets.UTF_8)
   .putObject(person, personFunnel)
   .hash();

Декомпозиция объектов выполняется с помощью воронки, которая включает инструкции о том, как читать объект, поэтому, если у нас есть Person с идентификатором, именем и годом рождения:

01
02
03
04
05
06
07
08
09
10
Funnel<Person> personFunnel = new Funnel<Person>() {
   @Override
   public void funnel(Person person, PrimitiveSink into) {
   into
      .putInt(person.id)
      .putString(person.firstName, Charsets.UTF_8)
      .putString(person.lastName, Charsets.UTF_8)
      .putInt(birthYear);
   }
};

3. InternetDomainName: заменит валидатор вашего доменного имени

Еще одна крутая маленькая утилита с Guava — это InternetDomainName, которая, что неудивительно, помогает анализировать и манипулировать доменными именами. Если вы когда-нибудь писали подобную утилиту самостоятельно, вы по достоинству оцените, как это помогает решить ее быстро и элегантно. И действует в соответствии с обновленными спецификациями RFC, используя список доменов из Public Suffix List , по инициативе фонда Mozilla. В целом он также имеет более конкретные методы, чем эквивалентный валидатор apache-commons. Давайте посмотрим на быстрый пример:

1
2
3
4
InternetDomainName owner =
   InternetDomainName.from("blog.takipi.com").topPrivateDomain(); // returns takipi.com
 
InternetDomainName.isValid(“takipi.monsters"); // returns false

Несколько понятий, которые могут сбивать с толку вокруг доменных имен:

  1. publicSuffix () — верхний домен, который является отдельной сущностью согласно общедоступному списку суффиксов. Таким образом, у нас будут результаты, такие как co.uk, .com, .cool (да, это настоящий суффикс и javais.cool , scalais.cool & cppis.cool ).
  2. topPrivateDomain () — верхний домен, который является отдельной сущностью согласно общедоступному списку суффиксов (PSL) . Применение его на blog.takipi.com возвращает takipi.com, НО, если вы попробуете это на сайте Github, то username.github.io вернет username.github.io, так как это отдельная сущность, которая появляется в PSL.

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

4. ClassPath Reflection: Зеркальное зеркало на стене

Изучая возможности отражения Java, способность проверять наш собственный код, вы обнаружите, что не существует простого способа получить список всех классов в вашем пакете или проекте. Это одна из функций Guava, которая нам действительно нравится, так как она помогает получить больше информации о среде, в которой вы работаете. Это работает так просто:

1
2
3
4
ClassPath classpath = ClassPath.from(classloader);
for (ClassPath.ClassInfo classInfo : classpath.getTopLevelClasses("com.mycomp.mypackage")) {
   System.out.println(classInfo.getName());
}

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

5. CharMatcher: упрощенное регулярное выражение?

Давайте закончим этот обзор возможностей другой проблемой, которую, я уверен, вы узнаете. У вас есть строка или серия строк, которые вы хотите отформатировать в определенном порядке, удалить пробелы или другие символы, заменить определенный символ, указать цифры или нет. Как правило, захватывать символы, которые соответствуют некоторому шаблону и что-то делать с ним. Здесь Guava предоставил метод CharMatcher для элегантной обработки таких проблем.

Для этой задачи у нас есть несколько предопределенных шаблонов, таких как JAVA_UPPER_CASE (заглавные буквы), JAVA_DIGIT (цифры), INVISIBLE (невидимые символы Unicode) и многие другие. Помимо предопределенных шаблонов, мы можем сами попробовать это сделать и создать собственные шаблоны. Давайте посмотрим, как это работает с быстрым примером кода:
String spaced = CharMatcher.WHITESPACE.trimAndCollapseFrom (string, »);

Это обрежет все пробелы в конце строки и объединит все последующие пробелы в один.

1
String keepAlex = CharMatcher.anyOf(“alex”).retainFrom(someOtherString);

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

Вывод

Мы видели некоторые из самых интересных функций Google Guava, за исключением популярных коллекций и библиотек кеша. Некоторые из них интенсивно используются в Такипи, а другие — полезные вещи, которые, по нашему мнению, могли бы принести пользу многим проектам. Google Guava помогает разработчикам работать продуктивно, и это именно то, чего мы в Takipi стремимся достичь с помощью инструментов, которые мы разрабатываем (кстати, это очень круто, но, эй, я, вероятно, пристрастен: вы можете попробовать это сами ).

Нам любопытно узнать, какие другие функции Guava вы используете, а большинство разработчиков — нет? (Коллекции и кеширование не в счет!). Пожалуйста, поделитесь своими мыслями в разделе комментариев ниже.