Guava(中文「石榴」)是 Google 開源的 Java 核心工具庫,廣泛應用於 Google 內部生產環境,涵蓋集合、緩存、並發、字符串、I/O、函數式風格等方方面面,堪稱 Java 標準庫的「增強版補完計劃」。以下按模組梳理其核心能力:
Optional、Preconditions.checkNotNull 等,推行「快速失敗」拒絕模糊的 null,消除 NPE 隱患。Preconditions.checkArgument/State,一行代碼替換冗長的 if-else throw。Objects.hashCode()、toStringHelper(),自動生成高質量 equals/hashCode/toString。ComparisonChain、Ordering,鏈式組合複雜排序邏輯,代碼如敘事般清晰。Throwables 簡化異常鏈獲取、堆疊追蹤轉字符串、受檢異常轉非受檢等操作。ImmutableList/Set/Map 等,防御性編程首選,線程安全、記憶體效率高、可作為常量安全發布。Multiset:元素可重複的 Set,自帶計數功能。Multimap:Key 對應多個 Value,替代 Map<K, List<V>> 的繁瑣操作。Table<R, C, V>:雙鍵映射,如試驗表、矩陣場景極致優雅。BiMap<K, V>:雙向映射,Key-Value 可互查,保證值唯一性。Lists、Sets、Maps、Iterables、Collections2 提供 JDK 缺失的分區、笛卡爾積、過濾、轉換、排序等豐富操作。ForwardingList/Map 裝飾器模式基類、AbstractIterator 簡化迭代器實現。高效能、線程安全的記憶體緩存,支援:
CacheLoader 自動載入、Callable 手動載入、RemovalListener 淘汰監聽。提供 Function、Predicate、Supplier 等函數式介面(JDK 8 前的補完),配合 Iterables.transform/filter、FluentIterable 實現鏈式流式處理。提示:JDK 8+ 專案優先使用 Stream API,Guava 函數式組件漸為輔助角色。
ListenableFuture:完成時觸發回調的 Future,解決阻塞式 get() 痛點,支援鏈式組合(Futures.transform 等)。Service 框架:抽象「可啟動/關閉」服務生命週期,管理狀態轉換(NEW → STARTING → RUNNING → STOPPING → TERMINATED),內建失敗處理與監聽器,極適合構建後台服務組件。RateLimiter:令牌桶限流器,平滑突發流量,分散式系統保護利器。Joiner(連接)、Splitter(分割)、CharMatcher(字符匹配/移除/修剪)、CaseFormat(命名風格轉換:camelCase ↔ UPPER_UNDERSCORE 等),處理邊界情況(空串、分隔符轉義)極其健壯。
針對 int、long、byte 等原生類型提供:無符號運算、字節序轉換、陣列工具(Ints、Longs 等)、哈希碼生成,彌補 JDK 集合不支援原生類型的缺口。
Range<C extends Comparable> 表示可比較類型的區間(開/閉/半開),支援交集、並集、包含判斷、跨度計算,適用於時間段、版本號範圍、數值區間等領域建模。
Files、Resources、ByteStreams、CharStreams 簡化文件讀寫、資源加載、流複製、行處理。Java 7+ NIO.2(java.nio.file)已原生提供更強大功能,新專案建議優先使用標準庫。
Hashing 提供 md5、sha1、crc32、murmur3、sipHash24 等高效能哈希;BloomFilter 實現空間極致優化的概率性去重/成員測試,適用於大數據預過濾、緩存穿透防護。
進程內發布-訂閱模式,組件無需顯式註冊彼此,通過 @Subscribe 註解聲明關注事件類型,支援同步/異步分發、死事件捕獲,解耦業務邏輯的輕量級選擇。
IntMath、LongMath、DoubleMath 提供經過嚴格測試的:對數、冪、開方、因子、組合數、素性測試等整數/浮點運算,避免手寫數學代碼的邊界錯誤。
Reflection 封裝常見反射操作:獲取無參構造器、調用可訪問方法/字段、類型檢查、參數化類型解析(TypeToken 捕獲泛型類型資訊),大幅降低反射代碼的樣板與異常處理負擔。
總結:Guava 不是「必須依賴」,而是「用過就回不去」的生產力乘數器。建議按需引入模組(guava 單體包或 guava-collect、guava-cache 等拆分包),並關注版本遷移指南(如 Optional 遷移至 JDK 8 java.util.Optional)。