Java Core
August 5, 2024

Расширяем возможности 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 делает вашу работу с коллекциями более выразительной и удобной, предоставляя множество дополнительных инструментов и возможностей. Попробуйте использовать эти коллекции в своих проектах и убедитесь в их преимуществах сами.