Guava для Java: полное руководство с примерами

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Что такое Guava и зачем она нужна?

Guava — это мощная библиотека с открытым исходным кодом от Google, которая предоставляет набор высококачественных утилит для языка Java. Она создана для того, чтобы сделать код Java более лаконичным, надёжным и производительным, решая множество типичных задач, с которыми сталкиваются разработчики.

Зачем нужна Guava? Java Standard Library (JDK) предоставляет базовый функционал, но часто оставляет желать лучшего в плане удобства и безопасности. Guava заполняет эти пробелы, предлагая:

  • Упрощение работы с коллекциями: Создание неизменяемых коллекций, фильтрация, преобразование, группировка — всё это становится в разы проще.
  • Кэширование: Мощный и гибкий фреймворк для кэширования данных в памяти.
  • Обработка примитивов: Утилиты для работы с массивами примитивных типов (int, long, double и т.д.).
  • Строковые операции: Удобные классы для работы со строками, такие как Joiner и Splitter.
  • Работа с функциями и предикатами: Функциональный стиль программирования (хотя и не такой лаконичный, как в Java 8+, но всё ещё полезный).
  • Проверка предусловий (Preconditions): Элегантная замена ручным проверкам на null и другие условия.
  • Работа с хэшированием: Утилиты для создания хэш-функций.
  • Потоки и конкурентность: Утилиты для работы с многопоточностью, включая ListenableFuture.

Если вы пишете на Java и хотите повысить качество и скорость разработки, Guava — это must-have библиотека.

Установка Guava

Guava не устанавливается через pip или npm, так как это библиотека для Java. Она распространяется через системы управления зависимостями, такие как Maven или Gradle.

Установка через Maven (pom.xml)

Добавьте следующий код в раздел <dependencies> вашего файла pom.xml:

<dependency>
    <groupId>com.google.guava</groupId>
    <artifactId>guava</artifactId>
    <version>33.2.0-jre</version> <!-- Используйте последнюю версию -->
</dependency>

Установка через Gradle (build.gradle)

Добавьте в раздел dependencies:

implementation 'com.google.guava:guava:33.2.0-jre'

Установка вручную (скачивание JAR)

Вы также можете скачать JAR-файл с GitHub-релиза Guava и добавить его в classpath вашего проекта.

Важно: Версия 33.2.0-jre предназначена для Java 8 и выше. Для более старых версий Java используйте версию android (например, 33.2.0-android).

Быстрый старт с примером кода

Давайте напишем простую программу, которая демонстрирует несколько ключевых возможностей Guava.

import com.google.common.base.Joiner;
import com.google.common.base.Splitter;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Lists;

import java.util.List;

public class GuavaQuickStart {
    public static void main(String[] args) {
        // 1. Создание неизменяемого списка
        ImmutableList<String> names = ImmutableList.of("Alice", "Bob", "Charlie");
        System.out.println("Имена: " + names); // [Alice, Bob, Charlie]

        // 2. Объединение строк с помощью Joiner
        String joined = Joiner.on(", ").join(names);
        System.out.println("Объединённые имена: " + joined); // Alice, Bob, Charlie

        // 3. Разделение строки с помощью Splitter
        String csv = "apple,banana,,grape";
        Iterable<String> fruits = Splitter.on(",")
                .trimResults()
                .omitEmptyStrings()
                .split(csv);
        System.out.println("Фрукты: " + fruits); // [apple, banana, grape]

        // 4. Создание изменяемого списка с помощью Lists
        List<String> mutableList = Lists.newArrayList("one", "two", "three");
        mutableList.add("four");
        System.out.println("Изменяемый список: " + mutableList); // [one, two, three, four]
    }
}

Этот пример показывает, как легко можно создавать коллекции, обрабатывать строки и работать с данными, используя Guava.

Основные методы и функции Guava

Рассмотрим 10 ключевых методов/классов Guava с подробным описанием и примерами.

1. Preconditions.checkNotNull()

Что делает: Проверяет, что переданный объект не равен null. Если объект null, выбрасывает NullPointerException с заданным сообщением. Это элегантная замена ручным проверкам.

Параметры:

  • T reference — объект для проверки.
  • Object errorMessage (опционально) — сообщение об ошибке.

Пример:

import com.google.common.base.Preconditions;

public class PreconditionsExample {
    public static void main(String[] args) {
        String name = null;
        // Выбросит NullPointerException с сообщением "name must not be null"
        Preconditions.checkNotNull(name, "name must not be null");
    }
}

2. Joiner.on()

Что делает: Создаёт объект Joiner, который используется для объединения последовательностей строк (или объектов) с заданным разделителем. Умеет пропускать null-значения.

Параметры:

  • String separator — разделитель.

Пример:

import com.google.common.base.Joiner;
import java.util.Arrays;
import java.util.List;

public class JoinerExample {
    public static void main(String[] args) {
        List<String> items = Arrays.asList("a", null, "b", "c");
        // Используем skipNulls() для пропуска null
        String result = Joiner.on(", ").skipNulls().join(items);
        System.out.println(result); // a, b, c
    }
}

3. Splitter.on()

Что делает: Создаёт объект Splitter, который разделяет строку на части по заданному разделителю. Предоставляет удобные методы для обрезки пробелов и пропуска пустых строк.

Параметры:

  • String separator — разделитель.

Пример:

import com.google.common.base.Splitter;

public class SplitterExample {
    public static void main(String[] args) {
        String input = "  foo ,,bar, qux  ";
        Iterable<String> parts = Splitter.on(",")
                .trimResults()   // Убираем пробелы
                .omitEmptyStrings() // Пропускаем пустые строки
                .split(input);
        System.out.println(parts); // [foo, bar, qux]
    }
}

4. ImmutableList.of()

Что делает: Создаёт неизменяемый (immutable) список. Это безопаснее и эффективнее, чем использование Collections.unmodifiableList(), так как Guava гарантирует, что данные не будут изменены.

Параметры:

  • E... elements — элементы списка.

Пример:

import com.google.common.collect.ImmutableList;

public class ImmutableListExample {
    public static void main(String[] args) {
        ImmutableList<Integer> numbers = ImmutableList.of(1, 2, 3, 4, 5);
        // numbers.add(6); // Вызовет UnsupportedOperationException
        System.out.println(numbers); // [1, 2, 3, 4, 5]
    }
}

5. Lists.newArrayList()

Что делает: Создаёт изменяемый ArrayList с указанными элементами или из итератора. Это удобная альтернатива new ArrayList<>().

Параметры:

  • Iterable<? extends E> elements (опционально) — элементы для инициализации списка.

Пример:

import com.google.common.collect.Lists;
import java.util.List;

public class ListsExample {
    public static void main(String[] args) {
        List<String> list = Lists.newArrayList("first", "second");
        list.add("third");
        System.out.println(list); // [first, second, third]
    }
}

6. Maps.newHashMap()

Что делает: Создаёт изменяемый HashMap. Аналогичен Lists.newArrayList(), но для карт.

Параметры:

  • Нет обязательных параметров.

Пример:

import com.google.common.collect.Maps;
import java.util.Map;

public class MapsExample {
    public static void main(String[] args) {
        Map<String, Integer> map = Maps.newHashMap();
        map.put("Alice", 30);
        map.put("Bob", 25);
        System.out.println(map); // {Alice=30, Bob=25}
    }
}

7. Sets.newHashSet()

Что делает: Создаёт изменяемый HashSet. Удобная фабрика для создания множеств.

Параметры:

  • E... elements (опционально) — элементы для инициализации множества.

Пример:

import com.google.common.collect.Sets;
import java.util.Set;

public class SetsExample {
    public static void main(String[] args) {
        Set<String> set = Sets.newHashSet("x", "y", "z");
        System.out.println(set); // [z, x, y] (порядок не гарантирован)
    }
}

8. MoreObjects.toStringHelper()

Что делает: Помогает реализовать метод toString() в классах, предоставляя удобный и читаемый вывод.

Параметры:

  • Object self — объект, для которого генерируется строка.

Пример:

import com.google.common.base.MoreObjects;

public class User {
    private String name;
    private int age;

    public User(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return MoreObjects.toStringHelper(this)
                .add("name", name)
                .add("age", age)
                .toString();
    }

    public static void main(String[] args) {
        User user = new User("Alice", 30);
        System.out.println(user); // User{name=Alice, age=30}
    }
}

9. Ordering.natural()

Что делает: Создаёт компаратор, который использует естественный порядок элементов (реализация Comparable). Позволяет легко сортировать коллекции.

Параметры:

  • Нет параметров.

Пример:

import com.google.common.collect.Ordering;
import java.util.Arrays;
import java.util.List;

public class OrderingExample {
    public static void main(String[] args) {
        List<Integer> numbers = Arrays.asList(5, 1, 4, 2, 3);
        Ordering<Integer> naturalOrder = Order                    

Рекомендаций