Guava
Guava是一個(gè)Google開源的Java核心庫,它提供了許多實(shí)用的工具和輔助類,使Java開發(fā)更加簡潔、高效、可靠。目前和hutool
一起,是業(yè)界常用的工具類庫。shigen
也比較喜歡使用,在這里列舉一下常用的工具類庫和使用的案例。
參考:
- 整理一波Guava的使用技巧 - 掘金
- Guava中這些Map的騷操作,讓我的代碼量減少了50% - 掘金
pom依賴
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>30.1.1-jre</version>
</dependency>
Map
Table-雙鍵map
Table 接口可以看作是一個(gè)類似于矩陣的數(shù)據(jù)結(jié)構(gòu),它包含兩個(gè)鍵:行鍵和列鍵。它的主要特點(diǎn)是可以通過兩個(gè)鍵來定位和訪問值, 它的類型:Table<R,C,V>
基礎(chǔ)的api
行列的轉(zhuǎn)制
public static <R, C, V> Table<C, R, V> transpose(Table<R, C, V> table) {
return (Table)(table instanceof Tables.TransposeTable ? ((Tables.TransposeTable)table).original : new Tables.TransposeTable(table));
}
轉(zhuǎn)換成嵌套的map
Map<String, Map<String, Integer>> rowMap = table.rowMap();
Map<String, Map<String, Integer>> columnMap = table.columnMap();
BiMap-雙向map
根據(jù)value快速找到key,所以要求key 和value都是唯一的
- 用
inverse
方法反轉(zhuǎn)了原來BiMap
的鍵值映射,但是這個(gè)反轉(zhuǎn)后的BiMap
并不是一個(gè)新的對象,它實(shí)現(xiàn)了一種視圖的關(guān)聯(lián),所以對反轉(zhuǎn)后的BiMap
執(zhí)行的所有操作會(huì)作用于原先的BiMap
上。 - 繼承hashMap,key、value都不能重復(fù)的
MultiMap-多值map
一個(gè)鍵映射到多個(gè)值上,底層是Map<String, List>
創(chuàng)建和轉(zhuǎn)換
Multimap<String, String> multiMap = ArrayListMultimap.create();
multiMap.putAll("name", Arrays.asList("shigen", "aaa", "bbb"));
Collection<String> names = multiMap.get("name");
Map<String, Collection<String>> stringCollectionMap = multiMap.asMap();
RangeMap-范圍map
RangeMap
描述了一種從區(qū)間到特定值的映射關(guān)系,讓我們能夠以更為優(yōu)雅的方法來書寫代碼
分?jǐn)?shù)段判斷案例
‘com.google.common.collect.RangeMap’ is marked unstable with @Beta
shigen
覺得這個(gè)很好用,為我們省略了很多根據(jù)區(qū)間判斷的if-else代碼
RangeMap<Integer, String> rangeMap = TreeRangeMap.create();
rangeMap.put(Range.closedOpen(0,60),"fail");
rangeMap.put(Range.closed(60,90),"satisfactory");
rangeMap.put(Range.openClosed(90,100),"excellent");
System.out.println(rangeMap.get(59));
System.out.println(rangeMap.get(60));
System.out.println(rangeMap.get(90));
System.out.println(rangeMap.get(91));
ClassToInstanceMap-實(shí)例Map
它的鍵是Class
,而值是這個(gè)Class
對應(yīng)的實(shí)例對象(Map<Class, List<Object>
)。取出對象時(shí)省去了強(qiáng)制類型轉(zhuǎn)換,避免手動(dòng)類型轉(zhuǎn)換失誤。
適合緩存對象,但是又不想做復(fù)雜的校驗(yàn)
MutableClassToInstanceMap<List> listMutableClassToInstanceMap = MutableClassToInstanceMap.create();
ArrayList<String> strings = new ArrayList<>();
strings.add("1111");
listMutableClassToInstanceMap.putInstance(ArrayList.class, strings);
ArrayList instance = listMutableClassToInstanceMap.getInstance(ArrayList.class);
// true
System.out.println(strings == instance);
Strings
-
isNullOrEmpty(String string)
:判斷字符串是否為空或null。 -
padEnd(String string, int minLength, char padChar)
:在字符串末尾填充指定字符,直到字符串達(dá)到指定長度。 -
padStart(String string, int minLength, char padChar)
:在字符串開頭填充指定字符,直到字符串達(dá)到指定長度。 -
repeat(String string, int count)
:重復(fù)指定字符串指定次數(shù)。 -
commonPrefix(CharSequence a, CharSequence b)
:獲取兩個(gè)字符串的最長公共前綴。 -
commonSuffix(CharSequence a, CharSequence b)
:獲取兩個(gè)字符串的最長公共后綴。
這一塊
shigen
還是習(xí)慣了使用hutool
的strUtil
,很符合我的代碼編程習(xí)慣。
Collections
-
ImmutableList
不可變集合是Guava的一個(gè)重要特性,它可以確保集合不被修改,從而避免并發(fā)訪問的問題
List<String> list = Lists.newArrayList("a", "b", "c");
ImmutableList<String> immutableList = ImmutableList.copyOf(list);
-
Iterables
獲得元素的API
獲得符合條件的元素
轉(zhuǎn)換集合類型
條件檢查(Preconditions)
Preconditions是Guava提供的一組前置條件檢查工具,它提供了一些檢查參數(shù)是否符合預(yù)期的方法。
shigen
覺得這個(gè)和assert
很相像。
以下是Preconditions的主要方法:
-
checkArgument(boolean expression, String errorMessageTemplate, Object... errorMessageArgs)
:檢查參數(shù)是否符合預(yù)期,并拋出IllegalArgumentException異常,可以包含錯(cuò)誤信息模板和占位符。 -
checkNotNull(T reference, String errorMessageTemplate, Object... errorMessageArgs)
:檢查參數(shù)是否為null,并拋出NullPointerException異常,可以包含錯(cuò)誤信息模板和占位符。 -
checkState(boolean expression, String errorMessageTemplate, Object... errorMessageArgs)
:檢查對象狀態(tài)是否符合預(yù)期,并拋出IllegalStateException異常,可以包含錯(cuò)誤信息模板和占位符。 -
checkElementIndex(int index, int size, String errorMessageTemplate, Object... errorMessageArgs)
:檢查下標(biāo)是否在集合的范圍內(nèi),并拋出IndexOutOfBoundsException異常,可以包含錯(cuò)誤信息模板和占位符。 -
checkPositionIndex(int index, int size, String errorMessageTemplate, Object... errorMessageArgs)
:檢查下標(biāo)是否在集合的范圍內(nèi),可以等于集合的大小,并拋出IndexOutOfBoundsException異常,可以包含錯(cuò)誤信息模板和占位符。 -
checkPositionIndexes(int start, int end, int size)
:檢查開始下標(biāo)和結(jié)束下標(biāo)是否在集合的范圍內(nèi),并拋出IndexOutOfBoundsException異常。
public class PreconditionsDemo {
public static void main(String[] args) {
// 檢查參數(shù)是否符合預(yù)期,并拋出IllegalArgumentException異常,可以包含錯(cuò)誤信息模板和占位符
String str1 = "abc";
Preconditions.checkArgument(str1.length() < 3, "字符串長度必須小于3");
// 檢查參數(shù)是否為null,并拋出NullPointerException異常,可以包含錯(cuò)誤信息模板和占位符
String str2 = null;
Preconditions.checkNotNull(str2, "字符串不能為空");
// 檢查對象狀態(tài)是否符合預(yù)期,并拋出IllegalStateException異常,可以包含錯(cuò)誤信息模板和占位符
boolean flag1 = false;
Preconditions.checkState(flag1, "狀態(tài)不正確");
// 檢查下標(biāo)是否在集合的范圍內(nèi),并拋出IndexOutOfBoundsException異常,可以包含錯(cuò)誤信息模板和占位符
List<Integer> list1 = Lists.newArrayList(1, 2, 3, 4, 5);
Preconditions.checkElementIndex(6, list1.size(), "下標(biāo)越界");
// 檢查下標(biāo)是否在集合的范圍內(nèi),可以等于集合的大小,并拋出IndexOutOfBoundsException異常,可以包含錯(cuò)誤信息模板和占位符
List<Integer> list2 = Lists.newArrayList(1, 2, 3, 4, 5);
Preconditions.checkPositionIndex(5, list2.size(), "下標(biāo)越界");
// 檢查開始下標(biāo)和結(jié)束下標(biāo)是否在集合的范圍內(nèi),并拋出IndexOutOfBoundsException異常
List<Integer> list3 = Lists.newArrayList(1, 2, 3, 4, 5);
Preconditions.checkPositionIndexes(2, 6, list3.size());
// 可以在錯(cuò)誤信息中使用占位符
int value1 = 101;
Preconditions.checkArgument(value1 <= 100, "值必須小于等于 %s", 100);
// 可以使用Supplier來避免計(jì)算開銷
int value2 = 101;
Preconditions.checkArgument(value2 <= 100, () -> "值必須小于等于 " + 100);
}
cacheBuilder
Cache是Guava提供的一個(gè)緩存工具類,它可以幫助我們在內(nèi)存中緩存數(shù)據(jù)。
- 緩存加載:指定緩存加載機(jī)制??梢酝ㄟ^傳遞一個(gè) CacheLoader 對象來定義如何加載緩存中不存在的數(shù)據(jù)。CacheLoader 是一個(gè)抽象類,需要實(shí)現(xiàn) load 方法,用于根據(jù)鍵加載對應(yīng)的值。
- 緩存大小限制:設(shè)置緩存的最大容量,當(dāng)緩存超過設(shè)定的容量時(shí),可以通過一些策略(比如使用 LRU 或 FIFO)來自動(dòng)淘汰一些不常用的緩存項(xiàng)。可以使用 maximumSize 方法設(shè)置緩存的最大容量。
- 過期時(shí)間:為緩存項(xiàng)設(shè)置過期時(shí)間??梢酝ㄟ^ expireAfterWrite 或 expireAfterAccess 方法設(shè)置緩存項(xiàng)的寫入或訪問后的過期時(shí)間。
- 弱引用鍵或值:CacheBuilder 提供了一些選項(xiàng),可以使用弱引用持有緩存的鍵或值。當(dāng)沒有其他地方引用某個(gè)鍵或值時(shí),緩存會(huì)自動(dòng)將其從內(nèi)存中移除,以避免內(nèi)存泄漏。
- 統(tǒng)計(jì)信息:CacheBuilder 提供了一些統(tǒng)計(jì)信息,包括緩存的命中率、加載次數(shù)、加載成功率等??梢酝ㄟ^調(diào)用 recordStats 方法開啟統(tǒng)計(jì)信息的收集。
@SneakyThrows
private static void testCache() {
// 創(chuàng)建一個(gè)緩存實(shí)例
Cache<String, String> cache = CacheBuilder.newBuilder()
// 最大容量為100個(gè)緩存項(xiàng)
.maximumSize(100)
// 10分鐘后過期
.expireAfterWrite(10, TimeUnit.MINUTES)
.build();
// 向緩存中存入數(shù)據(jù)
cache.put("key1", "value1");
cache.put("key2", "value2");
// 從緩存中獲取數(shù)據(jù)
String value1 = cache.getIfPresent("key1");
// 輸出: Value1: value1
System.out.println("Value1: " + value1);
// 存中存在,則返回對應(yīng)的值;如果緩存中不存在,則使用提供的函數(shù)加載新的值,并將其添加到緩存中
String value3 = cache.get("key3", () -> "value3");
// 輸出: Value3: value3
System.out.println("Value3: " + value3);
// 獲取緩存的統(tǒng)計(jì)信息
CacheStats stats = cache.stats();
// 輸出: Hit Rate: 1.0
System.out.println("Hit Rate: " + stats.hitRate());
}
以上就是這些常用的使用場景了。也歡迎伙伴們交流一下常用的工具庫的方法。文章來源:http://www.zghlxwxcb.cn/news/detail-696346.html
與shigen
一起,每天不一樣!文章來源地址http://www.zghlxwxcb.cn/news/detail-696346.html
到了這里,關(guān)于推薦Java開發(fā)常用的工具類庫google guava的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!