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://www.pswp.cn/news/921683.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/921683.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

redission实现读写锁的原理

Redisson 实现分布式读写锁的核心原理是 ​基于 Redis 的 Lua 脚本原子操作​ ​Pub/Sub 通知机制&#xff0c;在保证强一致性的同时实现高效的读并发&#xff08;读不阻塞读&#xff0c;写阻塞读&#xff09;。以下是其核心设计&#xff1a;​一、核心数据结构​Redisson 使用…

【 ​​SQL注入漏洞靶场】第二关文件读写

SQLi-Labs​它是一个开源的、专门为学习 ​​Web安全​​ 和 ​​SQL注入技术​​ 而设计的靶场项目。开发者故意在代码中留下了各种不同类型的SQL注入漏洞&#xff0c;让安全研究人员、学生和爱好者可以在一个合法、安全的环境中进行实战练习&#xff0c;从而掌握发现和利用SQ…

设计艺术~缓存结构设计

背景 面对高QPS场景的业务&#xff0c;不得不考虑对一些数据做缓存设计&#xff0c;常见的缓存设计有这些&#xff1a;DB Proxy缓存、分布式缓存、Localcache缓存。 在考虑加缓存的背景下不考虑数据的一致性&#xff0c;都是瞎扯&#xff0c;所以我们再定义一下数据的一致性场景…

后端开发技术栈

后端开发技术栈核心技术内容平台 (Content Platform)电商 (E-Commerce)金融科技 (FinTech) / 支付物联网 (IoT - Internet of Things)游戏后端 (Game Backend)社交平台搜索平台企业级应用开发音视频处理后端地图与地理位置服务DevOps大数据开发大模型应用开发智能合约开发核心技…

【ICCV2025】计算机视觉|即插即用|ESC:颠覆Transformer!超强平替,ESC模块性能炸裂!

论文地址&#xff1a;https://arxiv.org/pdf/2503.06671 代码地址&#xff1a;https://github.com/dslisleedh/ESC 关注UP CV缝合怪&#xff0c;分享最计算机视觉新即插即用模块&#xff0c;并提供配套的论文资料与代码。 https://space.bilibili.com/473764881 摘要 本研究…

【面试场景题】如何进行高并发系统的性能测试?

文章目录一、明确测试目标与指标二、测试环境搭建三、测试工具选型四、测试场景设计五、执行测试与监控六、瓶颈分析与调优七、测试报告与迭代总结高并发系统的性能测试是验证系统在极限流量下是否能保持稳定运行的关键环节&#xff0c;需要结合场景设计、工具选型、指标监控、…

攻防世界ReverseMe-120

这道题比较经典&#xff0c;涉及三个知识点&#xff0c;所以记录一下。首先给了一个文件&#xff0c;detect it easy看了下&#xff0c;是32位exe。放入ida中&#xff0c;找下main函数&#xff0c;F5反编译看一下伪代码。int __cdecl main(int argc, const char **argv, const …

小白也能看懂,HTTP中的文件上传与下载到底发生了什么?

HTTP 文件传输协议解析&#xff1a;上传与下载 这份文档会用最简单的方式&#xff0c;带你了解 HTTP 协议是如何处理文件下载和上传的。我们会专注于协议本身&#xff0c;看看客户端&#xff08;比如你的浏览器&#xff09;和服务端&#xff08;网站服务器&#xff09;之间到底…

快速构建数据集-假数据(生成划分)

快速构建数据集-假数据1、torch.randn&#xff08;✅&#xff09;2、HuggingFace Datasets&#xff08;✅&#xff09;&#x1f539;1. 从字典生成&#x1f539;2. 从 pandas.DataFrame 生成&#x1f539;3. 批量生成“业务型”假数据&#xff08;配合 Faker&#xff09;&#…

[修订版]Xenomai/IPIPE源代码情景解析

[修订版]Xenomai/IPIPE源代码情景解析 第一章&#xff1a;Interrupt Pipeline介绍 1.1 I-pipe与Xenomai1.2 I-pipe核心概念1.3 拉取I-pipe代码 第二章&#xff1a;I-pipe对ARM64异常的改造 2.1 ARM64中断机制与异常处理2.2 EL0_IRQ 中断改造之入口2.3 EL0_IRQ 中断改造之中断处…

【Qt开发】按钮类控件(三)-> QCheckBox

目录 1 -> 概述 2 -> 核心特性 2.1 -> 状态管理 2.2 -> 信号机制 2.3 -> 外观与文本 3 -> 应用场景 4 -> 代码示例 5 -> 总结 1 -> 概述 QCheckBox 是 Qt 框架中提供的一个基础控件&#xff0c;用于实现复选框功能。它允许用户在两种或三种…

在新发布的AI论文中 pytorch 和tensorflow 的使用比例

根据 2025 年最新的学术动态和行业报告&#xff0c;PyTorch 在 AI 论文中的使用比例已占据绝对主导地位&#xff0c;而 TensorFlow 的占比持续下降。以下是基于多个权威来源的综合分析&#xff1a; 一、顶级会议中的框架分布 在 NeurIPS、ICML、CVPR 等顶级学术会议中&#xff…

3DXML格式是什么?用什么软件可以打开?

3DXML 是一种开放标准的数据交换格式&#xff0c;主要用于三维 CAD&#xff08;计算机辅助设计&#xff09;模型的存储和交换。它是由 Dassault Systmes 开发的一种文件格式&#xff0c;常用于 CATIA V6 和其他支持该格式的应用程序中。3DXML 文件可以包含完整的 3D 模型数据&a…

9月8日星期一今日早报简报微语报早读

9月8日星期一&#xff0c;农历七月十七&#xff0c;早报#微语早读。1、中国火箭与月亮同框&#xff0c;遥感四十号03组卫星发射成功&#xff1b;2、湖南郴州开发区改革&#xff1a;编制数由815名减至680名&#xff0c;精简16.6%&#xff1b;3、水利部对广东、广西启动洪水防御Ⅳ…

windows系统搭建MQTT服务器

1、MQTT 协议 MQTT协议&#xff1a;实现MQTT协议需要客户端和服务器端通讯完成。 三种身份: 发布者(Publish)、代理(Broker)(服务器)、订阅者(Subscribe)。 消息的发布者和订阅者都是客户端&#xff0c;消息代理是服务器&#xff0c;消息发布者可以同时是订阅者。 MQTT&am…

从 GPT 到 LLaMA:解密 LLM 的核心架构——Decoder-Only 模型

&#x1f525;从 GPT 到 LLaMA&#xff1a;解密 LLM 的核心架构——Decoder-Only 模型 “为什么所有大模型&#xff08;LLM&#xff09;都长一个样&#xff1f;” 因为它们都有一个共同的“基因”——Decoder-Only 架构。 在前面两节中&#xff0c;我们学习了&#xff1a; BER…

Codeforces Round 1047 (Div. 3)

由于最近这三天的数学建模&#xff0c;让我这个精力本来就不多的AI手更加力竭了&#xff0c;没注意到昨晚的cf&#xff0c;所以今天来补题了。 比赛连接&#xff1a;比赛传送门 A题&#xff1a; You are doing a research paper on the famous Collatz Conjecture. In your e…

C++经典的数据结构与算法之经典算法思想:贪心算法(Greedy)

贪心算法&#xff08;Greedy Algorithm&#xff09;&#xff1a;通过局部最优达成全局最优的决策策略 贪心算法是一种通过每次选择局部最优解来期望全局最优解的算法思想。它不考虑未来的影响&#xff0c;仅根据当前信息做出最优选择&#xff0c;适用于具有贪心选择性质和最优子…

LangChain实战(二十一):构建自动化AI客服系统

本文是《LangChain实战课》系列的第二十一篇,将带领您构建一个完整的自动化AI客服系统。通过结合对话记忆、工具调用和业务知识库,我们将创建一个能够处理复杂客户查询的智能客服解决方案。 前言 在现代商业环境中,客户服务是企业成功的关键因素之一。传统客服系统往往面临…

一人公司智能管理系统概述

系统概述 项目结构 Al_Compny系统采用前后端分离的全栈架构&#xff0c;项目根目录下包含两个主要子目录&#xff1a;Al_Compny_backend&#xff08;后端服务&#xff09;和Al_Compny_frontend&#xff08;前端应用&#xff09;。核心功能模块 Al_Compny系统是一个面向"一…