Guava 简介:让 Java 开发更高效

Guava 是由 Google 开源的 Java 库,旨在为开发者提供一系列实用的工具类,以提高开发效率。它包含了集合类、缓存、并发工具、字符串处理等实用方法。

Guava 的常用场景

  1. 集合处理 :Guava 提供了多种扩展的集合类,如 MultisetMultimapTable 等,这些类在处理复杂数据结构时非常有用。

  2. 缓存:Guava 的缓存机制可以帮助开发者轻松实现数据缓存,提高程序性能。

  3. 并发编程 :Guava 提供了强大的并发工具,如 ListenableFuture,使得多线程编程更容易。

  4. 字符串处理 :Guava 提供了方便的字符串工具类,如 JoinerSplitter,用于字符串的拼接和分割。

常用的 API

集合工具类

  • ImmutableList:不可变列表,用于防御性编程和性能提升。

    java 复制代码
    import com.google.common.collect.ImmutableList;
    ImmutableList list = ImmutableList.of("apple", "banana");
  • Multiset:可重复元素的集合。

    java 复制代码
    import com.google.common.collect.HashMultiset;
    HashMultiset multiset = HashMultiset.create();
    multiset.add("apple", 3);
  • Multimap:可重复键的映射。

    java 复制代码
    import com.google.common.collect.ArrayListMultimap;
    ArrayListMultimap multimap = ArrayListMultimap.create();
    multimap.put("fruit", "apple");
    multimap.put("fruit", "banana");
  • BiMap:双向映射,键和值都不能重复。

    java 复制代码
    import com.google.common.collect.HashBiMap;
    HashBiMap bimap = HashBiMap.create();
    bimap.put("key1", "value1");

缓存

  • CacheBuilder :用于构建缓存,支持多种缓存策略。

    java 复制代码
    import com.google.common.cache.CacheBuilder;
    Cache cache = CacheBuilder.newBuilder()
        .maximumSize(1000)
        .expireAfterWrite(10, TimeUnit.MINUTES)
        .build();

并发工具

  • ListenableFuture :支持回调的 Future,用于异步编程。

    java 复制代码
    import com.google.common.util.concurrent.ListenableFuture;
    import com.google.common.util.concurrent.ListeningExecutorService;
    ListeningExecutorService executor = MoreExecutors.listeningDecorator(Executors.newSingleThreadExecutor());
    ListenableFuture future = executor.submit(() -> "Hello, World!");
    Futures.addCallback(future, new FutureCallback() {
        @Override
        public void onSuccess(String result) {
            System.out.println(result);
        }
    
        @Override
        public void onFailure(Throwable t) {
            t.printStackTrace();
        }
    });

字符串处理

  • Joiner:用于字符串的拼接。

    java 复制代码
    import com.google.common.base.Joiner;
    String joined = Joiner.on(",").join(Arrays.asList("1", "2", "3"));
  • Splitter:用于字符串的分割。

    java 复制代码
    import com.google.common.base.Splitter;
    List parts = Splitter.on(",").splitToList("1,2,3");

其他工具

  • Preconditions:用于参数校验。

    java 复制代码
    import com.google.common.base.Preconditions;
    Preconditions.checkNotNull(obj, "Object cannot be null");
  • Optional:用于处理可能为 null 的值。

    java 复制代码
    import com.google.common.base.Optional;
    Optional optional = Optional.fromNullable("Hello");
    if (optional.isPresent()) {
        System.out.println(optional.get());
    }

解决的问题

  1. 简化代码:Guava 提供了许多实用工具类,帮助开发者简化代码,提高可读性和可维护性。

  2. 提高性能:通过缓存和并发工具,Guava 可以显著提高程序的性能。

  3. 减少错误:Guava 的验证机制和防御性编程方法有助于减少编码错误。

示例:使用 Guava 缓存提高性能

假设我们有一个昂贵的数据库查询操作,我们可以使用 Guava 缓存来缓存查询结果,以提高程序的性能。

java 复制代码
import com.google.common.cache.CacheBuilder;
import com.google.common.cache.CacheLoader;
import com.google.common.cache.LoadingCache;

public class DatabaseQueryCache {
    private final LoadingCache cache;

    public DatabaseQueryCache() {
        cache = CacheBuilder.newBuilder()
                .maximumSize(1000)
                .expireAfterWrite(10, TimeUnit.MINUTES)
                .build(new CacheLoader() {
                    @Override
                    public String load(String key) {
                        // Simulate an expensive database query
                        try {
                            Thread.sleep(1000); // Wait for 1 second
                        } catch (InterruptedException e) {
                            Thread.currentThread().interrupt();
                        }
                        return "Result for " + key;
                    }
                });
    }

    public String query(String key) {
        return cache.getUnchecked(key);
    }

    public static void main(String[] args) {
        DatabaseQueryCache cache = new DatabaseQueryCache();
        System.out.println(cache.query("key1")); // First query takes 1 second
        System.out.println(cache.query("key1")); // Subsequent queries are instant
    }
}

示例:使用 Guava 的 Multimap 处理复杂数据结构

假设我们需要处理一个复杂的数据结构,其中一个键可以对应多个值,我们可以使用 Guava 的 Multimap 来实现。

java 复制代码
import com.google.common.collect.ArrayListMultimap;
import com.google.common.collect.Multimap;

public class MultimapExample {
    public static void main(String[] args) {
        Multimap multimap = ArrayListMultimap.create();
        multimap.put("fruit", "apple");
        multimap.put("fruit", "banana");
        multimap.put("vegetable", "carrot");

        System.out.println(multimap.get("fruit")); // Output: [apple, banana]
    }
}

通过这些示例,我们可以看到 Guava 如何帮助我们简化代码、提高性能和减少错误。

相关推荐
想用offer打牌6 小时前
MCP (Model Context Protocol) 技术理解 - 第二篇
后端·aigc·mcp
passerby60618 小时前
完成前端时间处理的另一块版图
前端·github·web components
KYGALYX8 小时前
服务异步通信
开发语言·后端·微服务·ruby
掘了8 小时前
「2025 年终总结」在所有失去的人中,我最怀念我自己
前端·后端·年终总结
爬山算法8 小时前
Hibernate(90)如何在故障注入测试中使用Hibernate?
java·后端·hibernate
Moment9 小时前
富文本编辑器在 AI 时代为什么这么受欢迎
前端·javascript·后端
草梅友仁9 小时前
墨梅博客 1.4.0 发布与开源动态 | 2026 年第 6 周草梅周报
开源·github·ai编程
Cobyte9 小时前
AI全栈实战:使用 Python+LangChain+Vue3 构建一个 LLM 聊天应用
前端·后端·aigc
程序员侠客行10 小时前
Mybatis连接池实现及池化模式
java·后端·架构·mybatis
Honmaple10 小时前
QMD (Quarto Markdown) 搭建与使用指南
后端