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
英文地址,請注明出處:http://en.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系統是一個面向"一…