Каковы некоторые из менее известных функций 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 |
Несколько понятий, которые могут сбивать с толку вокруг доменных имен:
- publicSuffix () — верхний домен, который является отдельной сущностью согласно общедоступному списку суффиксов. Таким образом, у нас будут результаты, такие как co.uk, .com, .cool (да, это настоящий суффикс и javais.cool , scalais.cool & cppis.cool ).
- 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 вы используете, а большинство разработчиков — нет? (Коллекции и кеширование не в счет!). Пожалуйста, поделитесь своими мыслями в разделе комментариев ниже.
Ссылка: | Google Guava: 5 вещей, которые вы никогда не знали, что могли бы сделать от нашего партнера JCG Алекса Житницкого в блоге Takipi . |