当前位置: 首页 > news >正文

Guava中常用的工具类

1. 集合工具类(com.google.common.collect

Guava 对 Java 集合框架进行了丰富扩展,解决了标准集合的诸多痛点。

(1)Lists / Sets / Maps:用于简化集合创建和操作:

// 创建不可变集合(线程安全,不可修改)
List<String> immutableList = Lists.newArrayList("a", "b", "c");
Set<Integer> immutableSet = Sets.newHashSet(1, 2, 3);
Map<String, Integer> immutableMap = Maps.newHashMap();// 集合操作(如合并、差集、交集)
Set<Integer> set1 = Sets.newHashSet(1, 2, 3);
Set<Integer> set2 = Sets.newHashSet(3, 4, 5);
Sets.SetView<Integer> union = Sets.union(set1, set2); // {1,2,3,4,5}
Sets.SetView<Integer> intersection = Sets.intersection(set1, set2); // {3}// 快速创建初始化大小的集合(避免扩容开销)
List<String> capacityList = Lists.newArrayListWithCapacity(100);

(2)ImmutableXXX(不可变集合)不可变集合一旦创建就不能修改,线程安全且性能更好:

// 不可变列表
ImmutableList<String> list = ImmutableList.of("a", "b", "c");// 不可变映射
ImmutableMap<String, Integer> map = ImmutableMap.of("one", 1,"two", 2
);// 构建复杂不可变集合
ImmutableSet<String> set = ImmutableSet.<String>builder().add("x").addAll(Sets.newHashSet("y", "z")).build();

(3)Multimap(多值映射)解决一个键对应多个值的场景(无需手动创建 Map<K, List<V>>):

Multimap<String, String> multimap = ArrayListMultimap.create();
multimap.put("fruit", "apple");
multimap.put("fruit", "banana");
multimap.put("color", "red");// 获取键对应的所有值
Collection<String> fruits = multimap.get("fruit"); // [apple, banana]// 转换为普通Map
Map<String, Collection<String>> map = multimap.asMap();

2. 字符串工具类(com.google.common.base

(1)Strings提供字符串常见操作:

// 空字符串处理
Strings.isNullOrEmpty(""); // true
Strings.nullToEmpty(null); // 转为空字符串""
Strings.emptyToNull(""); // 转为null// 填充字符串(左对齐/右对齐)
Strings.padStart("123", 5, '0'); // "00123"(总长度5,不足补0)
Strings.padEnd("123", 5, '0'); // "12300"// 重复字符串
Strings.repeat("ab", 3); // "ababab"

(2)Joiner / Splitter更灵活的字符串拼接与拆分:

// 拼接(自动处理null和空值)
Joiner joiner = Joiner.on(",").skipNulls(); // 用逗号拼接,跳过null
String result = joiner.join("a", null, "b"); // "a,b"// 拼接Map
Joiner mapJoiner = Joiner.on(";").withKeyValueSeparator("=");
mapJoiner.join(ImmutableMap.of("name", "Alice", "age", "30")); // "name=Alice;age=30"// 拆分(支持更复杂的规则)
Splitter splitter = Splitter.on(",").trimResults().omitEmptyStrings();
List<String> parts = splitter.splitToList(" a , , b "); // ["a", "b"]// 按固定长度拆分
Splitter.fixedLength(2).split("abcdef"); // ["ab", "cd", "ef"]

3. 缓存工具类(com.google.common.cache

Cache 是轻量级本地缓存实现,比 HashMap 多了过期策略、加载机制等:

// 创建缓存(设置最大容量和过期时间)
LoadingCache<String, String> cache = CacheBuilder.newBuilder().maximumSize(1000) // 最大缓存项数.expireAfterWrite(10, TimeUnit.MINUTES) // 写入后10分钟过期.build(new CacheLoader<String, String>() {// 缓存未命中时的加载逻辑@Overridepublic String load(String key) {return fetchFromDatabase(key); // 从数据库加载数据}});// 使用缓存
try {String value = cache.get("key1"); // 存在则返回,否则调用load()加载
} catch (ExecutionException e) {// 处理异常
}// 手动放入缓存
cache.put("key2", "value2");// 移除缓存
cache.invalidate("key1");

4. 并发工具类(com.google.common.util.concurrent

(1)ListenableFuture增强版 Future,支持添加回调函数,避免阻塞等待:

// 创建线程池
ListeningExecutorService executor = MoreExecutors.listeningDecorator(Executors.newFixedThreadPool(5)
);// 提交任务,返回ListenableFuture
ListenableFuture<String> future = executor.submit(() -> {Thread.sleep(1000);return "任务结果";
});// 添加回调(任务完成时自动执行)
Futures.addCallback(future, new FutureCallback<String>() {@Overridepublic void onSuccess(String result) {System.out.println("成功:" + result);}@Overridepublic void onFailure(Throwable t) {System.err.println("失败:" + t.getMessage());}
}, executor);

5. 基本类型工具类(com.google.common.primitives

针对 intlongboolean 等基本类型提供工具方法:

// Ints:int类型工具
Ints.contains(new int[]{1, 2, 3}, 2); // true
Ints.max(1, 3, 5); // 5
List<Integer> intList = Ints.asList(1, 2, 3); // 转为List<Integer>// 类似的还有Longs、Doubles、Booleans等

6. 时间工具类(com.google.common.base

(1)Stopwatch精确测量代码执行时间

// 1. 创建 Stopwatch 实例(未启动)
Stopwatch stopwatch = Stopwatch.createUnstarted();// 2. 开始计时
stopwatch.start();// ----------------------
// 目标代码:模拟耗时操作(如接口调用、数据处理)
Thread.sleep(1500); // 模拟1.5秒耗时
// ----------------------// 3. 停止计时
stopwatch.stop();// 4. 获取耗时(支持多种时间单位)
long elapsedMs = stopwatch.elapsed(TimeUnit.MILLISECONDS); // 毫秒:1500左右
long elapsedNs = stopwatch.elapsed(TimeUnit.NANOSECONDS); // 纳秒:1500000000左右
long elapsedS = stopwatch.elapsed(TimeUnit.SECONDS);     // 秒:1(向下取整)

7. 谓词与函数(com.google.common.base

(1)Predicate(谓词,用于条件判断)

Predicate<String> isLongThan3 = s -> s.length() > 3;
List<String> list = Lists.newArrayList("a", "bb", "ccc", "dddd");
// 过滤符合条件的元素
List<String> filtered = Lists.newArrayList(Iterables.filter(list, isLongThan3));

(2)Function(函数,用于类型转换)

Function<String, Integer> strToInt = Integer::parseInt;
List<String> strList = Lists.newArrayList("1", "2", "3");
// 转换为Integer列表
List<Integer> intList = Lists.transform(strList, strToInt);

8. 前置条件(com.google.common.base.Preconditions

简化参数校验代码:Spring 框架的 Assert 类(org.springframework.util.Assert)与 Guava Preconditions 功能类似,常用于 Spring 项目中的参数校验:

public void process(String name, int age) {// 校验参数,失败则抛出异常Preconditions.checkNotNull(name, "名称不能为空");Preconditions.checkArgument(age > 0, "年龄必须为正数:%s", age);Preconditions.checkState(age < 150, "年龄不能超过150");
}

引入依赖

使用 Guava 需在项目中引入依赖(以 Maven 为例):

<dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>32.1.3-jre</version> <!-- 版本可按需更新 -->
</dependency>

文章转载自:

http://68fpsTa7.hjbrd.cn
http://ds4lFh3G.hjbrd.cn
http://iY58Ffm1.hjbrd.cn
http://11N8fW0Z.hjbrd.cn
http://tdiPlGJ8.hjbrd.cn
http://7QAUJroM.hjbrd.cn
http://ue7mWiEv.hjbrd.cn
http://Za8GiaoC.hjbrd.cn
http://irztOXSZ.hjbrd.cn
http://UCQ9rXlT.hjbrd.cn
http://qb3vbbnC.hjbrd.cn
http://mZuKNjsK.hjbrd.cn
http://pZOXT702.hjbrd.cn
http://sLYbOY9H.hjbrd.cn
http://BqoXezTp.hjbrd.cn
http://8xlY3G9R.hjbrd.cn
http://vAGwnJl2.hjbrd.cn
http://B16vsE65.hjbrd.cn
http://hrOre4Kz.hjbrd.cn
http://sfia8jVr.hjbrd.cn
http://TNz5vrnH.hjbrd.cn
http://sfopK8p7.hjbrd.cn
http://DW1AxspB.hjbrd.cn
http://dBhrjA8V.hjbrd.cn
http://em6M3rQA.hjbrd.cn
http://ZV0wV5XC.hjbrd.cn
http://G6XXZ5Yw.hjbrd.cn
http://3kyrdgbi.hjbrd.cn
http://pOnSbkkd.hjbrd.cn
http://ZsDhnQFk.hjbrd.cn
http://www.dtcms.com/a/373451.html

相关文章:

  • Entity Digital Sports 降低成本并快速扩展
  • 计算机毕业设计选题:基于Spark+Hadoop的健康饮食营养数据分析系统【源码+文档+调试】
  • Rust异步运行时最小实现 - extreme 分享
  • 内网穿透的应用-Navidrome与cpolar本地搭建跨网络访问的云音乐服务器
  • 金融量化指标--2Alpha 阿尔法
  • Qoder 完整使用指南
  • Coze源码分析-资源库-删除插件-后端源码-数据访问和基础设施层
  • GitHub OAuth 登录实现
  • 容器-资源隔离机制
  • WGAI项目前后端项目简介及首页监控
  • 前端通过后端给的webrtc的链接,在前端展示,并更新实时状态
  • 如何安装 Google 通用的驱动以便使用 ADB 和 Fastboot 调试(Bootloader)设备
  • Vue: 自定义组件和 nextTick
  • Day38 SQLite数据库 C 语言接口
  • 【JobScheduler】Android 后台任务调度的核心组件指南
  • ESD二极管防护方案,怎么做好ESD保护选型?-ASIM阿赛姆
  • 深度学习入门:从神经网络到反向传播
  • 《2025年AI产业发展十大趋势报告》四十五
  • Java 多线程(一)
  • Excel VBA 自动生成文件夹框架
  • 算法日记---滑动窗口
  • 《嵌入式硬件(四):温度传感器DS1820》
  • 动态规划-学习笔记
  • Java分布式锁详解
  • Docker学习笔记(四):网络管理与容器操作
  • 基于MATLAB的FIR和IIR低通带通滤波器实现
  • SpringMVC 程序开发
  • 深入理解 Linux hostname 命令:从日常操作到运维实战
  • SN码追溯技术全景解析:AI时代的数字身份革命
  • AI 小白入门:探索模型上下文协议(MCP)及其前端应用