Расширяем возможности Java с Google Guava: дополнительные коллекции, примеры использования
Введение
Google Guava — это библиотека для Java, разработанная Google, которая предоставляет множество удобных утилит для работы с коллекциями, функциональным программированием, кэшированием, параллелизмом и другими аспектами разработки. В этой статье мы рассмотрим дополнительные реализации коллекций, предлагаемые Google Guava, приведем примеры их использования и покажем, как добавить библиотеку в проект.
Установка Google Guava в проект
Для использования Google Guava в проекте необходимо добавить зависимость в файл конфигурации сборки. Инструкции для разных систем сборки можно найти на официальной странице Google Guava на GitHub.
Использование с Maven
Добавьте следующую зависимость в ваш pom.xml:
<dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>32.1.2-jre</version> </dependency>
Использование с Gradle
Добавьте следующую строку в ваш файл build.gradle:
implementation 'com.google.guava:guava:32.1.2-jre'
Основные Коллекции Google Guava
Guava предоставляет несколько расширений стандартных коллекций Java, а также новые типы коллекций, которые упрощают и улучшают работу с данными. Вот некоторые из них:
Immutable Collections
Неизменяемые коллекции гарантируют, что их содержимое не будет изменяться после создания. Это делает их потокобезопасными и может улучшить производительность, устраняя необходимость синхронизации.
import com.google.common.collect.ImmutableList;
public class ImmutableExample {
public static void main(String[] args) {
ImmutableList<String> immutableList = ImmutableList.of("one", "two", "three");
System.out.println(immutableList);
// Any attempt to modify the list will throw UnsupportedOperationException
// immutableList.add("four"); // This will throw an exception
}
}Multiset
Multiset — это коллекция, которая позволяет хранить дубликаты элементов и отслеживать количество их вхождений.
import com.google.common.collect.HashMultiset;
import com.google.common.collect.Multiset;
public class MultisetExample {
public static void main(String[] args) {
Multiset<String> multiset = HashMultiset.create();
multiset.add("apple");
multiset.add("banana");
multiset.add("apple");
System.out.println(multiset.count("apple")); // Output: 2
System.out.println(multiset.count("banana")); // Output: 1
}
}Multimap
Multimap — это коллекция, которая позволяет хранить несколько значений для одного ключа.
import com.google.common.collect.ArrayListMultimap;
import com.google.common.collect.Multimap;
public class MultimapExample {
public static void main(String[] args) {
Multimap<String, String> multimap = ArrayListMultimap.create();
multimap.put("fruit", "apple");
multimap.put("fruit", "banana");
multimap.put("vegetable", "carrot");
System.out.println(multimap.get("fruit")); // Output: [apple, banana]
System.out.println(multimap.get("vegetable")); // Output: [carrot]
}
}
BiMap
BiMap — это двухсторонняя карта, которая позволяет уникальные соответствия между ключами и значениями. Это означает, что вы можете выполнять обратный поиск по значениям, как и по ключам.
import com.google.common.collect.HashBiMap;
import com.google.common.collect.BiMap;
public class BiMapExample {
public static void main(String[] args) {
BiMap<String, Integer> biMap = HashBiMap.create();
biMap.put("one", 1);
biMap.put("two", 2);
System.out.println(biMap.get("one")); // Output: 1
System.out.println(biMap.inverse().get(1)); // Output: one
}
}
Table
Table представляет собой двумерную карту, аналогичную Map<R, Map<C, V>>.
import com.google.common.collect.HashBasedTable;
import com.google.common.collect.Table;
public class TableExample {
public static void main(String[] args) {
Table<String, String, Integer> table = HashBasedTable.create();
table.put("row1", "col1", 1);
table.put("row1", "col2", 2);
table.put("row2", "col1", 3);
System.out.println(table.get("row1", "col1")); // Output: 1
System.out.println(table.row("row1")); // Output: {col1=1, col2=2}
System.out.println(table.column("col1")); // Output: {row1=1, row2=3}
}
}
RangeSet и RangeMap
RangeSet и RangeMap предоставляют удобные способы работы с диапазонами чисел и ассоциациями диапазонов с объектами.
Пример использования RangeSet:
import com.google.common.collect.Range;
import com.google.common.collect.TreeRangeSet;
import com.google.common.collect.RangeSet;
public class RangeSetExample {
public static void main(String[] args) {
RangeSet<Integer> rangeSet = TreeRangeSet.create();
rangeSet.add(Range.closed(1, 10));
rangeSet.add(Range.closed(20, 30));
System.out.println(rangeSet.contains(5)); // Output: true
System.out.println(rangeSet.contains(15)); // Output: false
}
}
Пример использования RangeMap:
import com.google.common.collect.Range;
import com.google.common.collect.TreeRangeMap;
import com.google.common.collect.RangeMap;
public class RangeMapExample {
public static void main(String[] args) {
RangeMap<Integer, String> rangeMap = TreeRangeMap.create();
rangeMap.put(Range.closed(1, 10), "Low");
rangeMap.put(Range.closed(11, 20), "Medium");
System.out.println(rangeMap.get(5)); // Output: Low
System.out.println(rangeMap.get(15)); // Output: Medium
}
}
Заключение
Google Guava предоставляет множество дополнительных коллекций, которые значительно расширяют возможности стандартных коллекций Java. Использование этих коллекций может упростить разработку, повысить производительность и улучшить читаемость кода. В этой статье мы рассмотрели основные из них, включая неизменяемые коллекции, Multiset, Multimap, BiMap, Table, RangeSet и RangeMap, и привели примеры их использования. Изучение и использование этих коллекций поможет вам создавать более эффективные и надежные приложения на Java.
Google Guava делает вашу работу с коллекциями более выразительной и удобной, предоставляя множество дополнительных инструментов и возможностей. Попробуйте использовать эти коллекции в своих проектах и убедитесь в их преимуществах сами.