Guava 簡介:讓 Java 開發更高效
Guava 是由 Google 開源的 Java 庫,旨在為開發者提供一系列實用的工具類,以提高開發效率。它包含了集合類、緩存、并發工具、字符串處理等實用方法。
Guava 的常用場景
- 集合處理:Guava 提供了多種擴展的集合類,如
Multiset
、Multimap
、Table
等,這些類在處理復雜數據結構時非常有用。 - 緩存:Guava 的緩存機制可以幫助開發者輕松實現數據緩存,提高程序性能。
- 并發編程:Guava 提供了強大的并發工具,如
ListenableFuture
,使得多線程編程更容易。 - 字符串處理:Guava 提供了方便的字符串工具類,如
Joiner
和Splitter
,用于字符串的拼接和分割。
常用的 API
集合工具類
-
ImmutableList:不可變列表,用于防御性編程和性能提升。
import com.google.common.collect.ImmutableList; ImmutableList list = ImmutableList.of("apple", "banana");
-
Multiset:可重復元素的集合。
import com.google.common.collect.HashMultiset; HashMultiset multiset = HashMultiset.create(); multiset.add("apple", 3);
-
Multimap:可重復鍵的映射。
import com.google.common.collect.ArrayListMultimap; ArrayListMultimap multimap = ArrayListMultimap.create(); multimap.put("fruit", "apple"); multimap.put("fruit", "banana");
-
BiMap:雙向映射,鍵和值都不能重復。
import com.google.common.collect.HashBiMap; HashBiMap bimap = HashBiMap.create(); bimap.put("key1", "value1");
緩存
-
CacheBuilder
:用于構建緩存,支持多種緩存策略。
import com.google.common.cache.CacheBuilder; Cache cache = CacheBuilder.newBuilder().maximumSize(1000).expireAfterWrite(10, TimeUnit.MINUTES).build();
并發工具
-
ListenableFuture
:支持回調的 Future,用于異步編程。
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() {@Overridepublic void onSuccess(String result) {System.out.println(result);}@Overridepublic void onFailure(Throwable t) {t.printStackTrace();} });
字符串處理
-
Joiner:用于字符串的拼接。
import com.google.common.base.Joiner; String joined = Joiner.on(",").join(Arrays.asList("1", "2", "3"));
-
Splitter:用于字符串的分割。
import com.google.common.base.Splitter; List parts = Splitter.on(",").splitToList("1,2,3");
其他工具
-
Preconditions:用于參數校驗。
import com.google.common.base.Preconditions; Preconditions.checkNotNull(obj, "Object cannot be null");
-
Optional:用于處理可能為 null 的值。
import com.google.common.base.Optional; Optional optional = Optional.fromNullable("Hello"); if (optional.isPresent()) {System.out.println(optional.get()); }
解決的問題
- 簡化代碼:Guava 提供了許多實用工具類,幫助開發者簡化代碼,提高可讀性和可維護性。
- 提高性能:通過緩存和并發工具,Guava 可以顯著提高程序的性能。
- 減少錯誤:Guava 的驗證機制和防御性編程方法有助于減少編碼錯誤。
示例:使用 Guava 緩存提高性能
假設我們有一個昂貴的數據庫查詢操作,我們可以使用 Guava 緩存來緩存查詢結果,以提高程序的性能。
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() {@Overridepublic String load(String key) {// Simulate an expensive database querytry {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 secondSystem.out.println(cache.query("key1")); // Subsequent queries are instant}
}
示例:使用 Guava 的 Multimap
處理復雜數據結構
假設我們需要處理一個復雜的數據結構,其中一個鍵可以對應多個值,我們可以使用 Guava 的 Multimap
來實現。
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 如何幫助我們簡化代碼、提高性能和減少錯誤。