Guava — это библиотека с открытым исходным кодом, содержащая множество классов для Java и написанная Google. Это потенциально полезный источник различных служебных функций и классов, которые, я уверен, многие разработчики написали сами раньше или, может быть, просто хотели и никогда не имели времени писать. Вот 5 веских причин использовать его!
1. Коллекция инициализаторов и утилит
Универсальные однородные коллекции — это отличная возможность иметь в Java, но иногда их конструкция слишком многословна, например:
1
|
final Map<String, Map<String, Integer>> lookup = new HashMap<String, Map<String, Integer>>(); |
Java 7 решает эту проблему действительно общим способом, позволяя ограниченную форму вывода типов, неофициально называемую Diamond Operator . Таким образом, мы можем переписать приведенный выше пример как:
1
|
final Map<String, Map<String, Integer>> lookup = new HashMap<>(); |
Фактически уже возможно иметь такой вывод для неконструктивных методов в более ранних выпусках Java, и Guava предоставляет много готовых конструкторов для существующих коллекций Java. Приведенный выше пример можно записать так:
1
|
final Map<String, Map<String, Integer>> lookup = Maps.newHashMap(); |
Guava также предоставляет множество полезных служебных функций для коллекций в Maps , Sets et al. классы. Мои любимые методы — это методы Sets.union и Sets.intersection, которые возвращают представления для наборов, а не пересчитывают значения.
2. Ограниченное функциональное программирование
Guava предоставляет некоторые распространенные методы для передачи методов в функциональном стиле. Например, функция отображения, существующая во многих функциональных языках программирования, существует в форме метода Collections2.transform . Collections2 также имеет метод фильтра, который позволяет вам ограничивать значения в коллекции. Например, чтобы удалить элементы из коллекции с нулевым значением и сохранить ее в другой коллекции, вы можете сделать следующее:
1
|
Collection<?> noNullsCollection = filter(someCollection, notNull()); |
Важно помнить, что в обоих случаях функция возвращает новую коллекцию, а не изменяет существующую, и что результирующие коллекции вычисляются лениво.
3. Мультикарты и бимапы
Действительно распространенный вариант использования карты включает в себя сохранение нескольких значений для одного ключа. Использование стандартных коллекций Java, которые обычно выполняются с использованием другой коллекции в качестве типа значения. Это, к сожалению, в конечном итоге включает в себя много церемоний, которые необходимо повторить с точки зрения инициализации коллекции. Мультикарты проясняют это, например:
1
2
3
4
5
|
Multimap<String, Integer> scores = HashMultimap.create(); scores.put( "Bob" , 20 ); scores.put( "Bob" , 10 ); scores.put( "Bob" , 15 ); System.out.println(Collections.max(scores.get( "Bob" ))); // prints 20 |
Есть также класс BiMap, который идет в другом направлении, то есть обеспечивает уникальность значений и ключей. Поскольку значения также уникальны, BiMap можно использовать в обратном порядке.
4. Простые хэш-коды и компараторы
Довольно распространено желание генерировать хеш-код для класса в Java из хеш-кодов его полей. Guava предоставляет метод для этого в классе Objects, вот пример:
1
2
3
4
5
6
7
|
int foo; String bar; @Override public int hashCode() { return Objects.hashCode(foo, bar); } |
Не забудьте сохранить контракт equals, если вы определяете метод хеш-кода.
Компараторы — это еще один пример, когда их написание часто включает в себя последовательность операций. Guava предоставляет класс ComparisonChain для упрощения этого процесса. Вот пример с классом int и String:
1
2
3
4
5
6
7
|
int foo; String bar; @Override public int compareTo( final GuavaExample o) { return ComparisonChain.start().compare(foo, o.foo).compare(bar, o.bar).result(); } |
5. Защитное кодирование
Вы когда-нибудь писали определенные предварительные условия для ваших методов регулярно? Иногда они могут быть излишне многословными или не передавать намерения так же прямо. Guava предоставляет классу Preconditions ряд общих предварительных условий.
Например, вместо оператора if и явного исключения …
1
2
3
|
if (count <= 0 ) { throw new IllegalArgumentException( "must be positive: " + count); } |
… вы можете использовать явное предварительное условие:
1
|
checkArgument(count > 0 , "must be positive: %s" , count); |
Выводы
Возможность заменить существующие библиотечные классы классами из guava, помогает вам сократить объем кода, который необходимо поддерживать, и обеспечивает потенциальное повышение производительности. Есть альтернативы, например, проект Apache Commons . Это может быть тот случай, когда вы уже используете и знаете эти библиотеки, или предпочитаете их подход и API подходу Guava. У Гуавы действительно есть кладбище идей, которое дает вам некоторое представление о том, что инженеры Google воспринимают как пределы библиотеки или как плохое дизайнерское решение. Вы не можете индивидуально соглашаться с этими вариантами, после чего вы снова начинаете писать свои собственные библиотечные классы. В целом, хотя Guava поощряет более лаконичный и менее церемонный стиль, и некоторое соответствующее применение Guava может помочь многим проектам Java.
Оригинал: http://insightfullogic.com/blog/2011/oct/21/5-reasons-use-guava/