Google guava工具類的介紹和使用

概述

工具類 就是封裝平常用的方法,不需要你重復(fù)造輪子,節(jié)省開發(fā)人員時(shí)間,提高工作效率。谷歌作為大公司,當(dāng)然會(huì)從日常的工作中提取中很多高效率的方法出來。所以就誕生了guava。
guava的優(yōu)點(diǎn):
1)高效設(shè)計(jì)良好的API,被Google的開發(fā)者設(shè)計(jì),實(shí)現(xiàn)和使用
2)遵循高效的java語(yǔ)法實(shí)踐
3)使代碼更刻度,簡(jiǎn)潔,簡(jiǎn)單
4)節(jié)約時(shí)間,資源,提高生產(chǎn)力

Guava工程包含了若干被Google的 Java項(xiàng)目廣泛依賴 的核心庫(kù),例如:
1)集合 [collections]
2)緩存 [caching]
3)原生類型支持 [primitives support]
4)并發(fā)庫(kù) [concurrency libraries]
5)通用注解 [common annotations]
6)字符串處理 [string processing]
7)I/O 等等。

1.集合的創(chuàng)建
// 普通Collection的創(chuàng)建
List<String> list = Lists.newArrayList();
Set<String> set = Sets.newHashSet();
Map<String, String> map = Maps.newHashMap();

// 不變Collection的創(chuàng)建
ImmutableList<String> iList = ImmutableList.of("a", "b", "c");
ImmutableSet<String> iSet = ImmutableSet.of("e1", "e2");
ImmutableMap<String, String> iMap = ImmutableMap.of("k1", "v1", "k2", "v2");

// 其他的黑科技集合
MultiSet: 無序+可重復(fù)   count()方法獲取單詞的次數(shù)  增強(qiáng)了可讀性+操作簡(jiǎn)單
創(chuàng)建方式:  Multiset<String> set = HashMultiset.create();

Multimap: key-value  key可以重復(fù)  
創(chuàng)建方式: Multimap<String, String> teachers = ArrayListMultimap.create();
Multimap<String,Integer> map = ArrayListMultimap.create();      
map.put("aa", 1);
map.put("aa", 2);
System.out.println(map.get("aa"));  //[1, 2]

創(chuàng)建不可變集合 先理解什么是immutable(不可變)對(duì)象
1)在多線程操作下,是線程安全的
2)所有不可變集合會(huì)比可變集合更有效的利用資源

2.將集合轉(zhuǎn)換為特定規(guī)則的字符串(Joiner)
//use java
List<String> list = new ArrayList<String>();
list.add("aa");
list.add("bb");
list.add("cc");
String str = "";
for(int i=0; i<list.size(); i++){
    str = str + "-" +list.get(i);
}
//str 為-aa-bb-cc

//use guava
List<String> list = new ArrayList<String>();
list.add("aa");
list.add("bb");
list.add("cc");
String result = Joiner.on("-").join(list);
//result為  aa-bb-cc

Map<String, Integer> map = Maps.newHashMap();
map.put("xiaoming", 12);
map.put("xiaohong",13);
String result = Joiner.on(",").withKeyValueSeparator("=").join(map);
// result為 xiaoming=12,xiaohong=13
3.將String轉(zhuǎn)換為特定的集合(Splitter)
//use java
List<String> list = new ArrayList<String>();
String a = "1-2-3-4-5-6";
String[] strs = a.split("-");
for(int i=0; i<strs.length; i++){
    list.add(strs[i]);
}

//use guava
String str = "1-2-3-4-5-6";
List<String> list = Splitter.on("-").splitToList(str);
//list為  [1, 2, 3, 4, 5, 6]

// guava還可以使用 omitEmptyStrings().trimResults() 去除空串與空格
String str = "1-2-3-4-  5-  6   ";  
List<String> list = Splitter.on("-").omitEmptyStrings().trimResults().splitToList(str);
System.out.println(list);

// 將String轉(zhuǎn)換為map
String str = "xiaoming=11,xiaohong=23";
Map<String,String> map = Splitter.on(",").withKeyValueSeparator("=").split(str);

// guava還支持多個(gè)字符切割,或者特定的正則分隔
String input = "aa.dd,,ff,,.";
List<String> result = Splitter.onPattern("[.|,]").omitEmptyStrings().splitToList(input);

9.計(jì)算中間代碼的運(yùn)行時(shí)間
Stopwatch stopwatch = Stopwatch.createStarted();
for(int i=0; i<100000; i++){
    // do some thing
}
long nanos = stopwatch.elapsed(TimeUnit.MILLISECONDS);
System.out.println(nanos);
11.guava緩存
// 使用Guava創(chuàng)建一個(gè)緩存
Cache<String, String> cache = CacheBuilder.newBuilder()
                .maximumSize(100) // 設(shè)置緩存的最大容量
                .expireAfterWrite(1, TimeUnit.MINUTES) // 設(shè)置緩存在寫入一分鐘后失效
                .concurrencyLevel(10) // 設(shè)置并發(fā)級(jí)別為10
                .recordStats() // 開啟緩存統(tǒng)計(jì)
                .build();
// 放入緩存
cache.put("key", "value");
// 獲取緩存,getIfPresent 不存在就返回null
String value = cache.getIfPresent("key");

CacheBuilder.newBuilder()
        // 設(shè)置緩存在寫入10分鐘后,通過CacheLoader的load方法進(jìn)行刷新
        .refreshAfterWrite(10, TimeUnit.SECONDS)
        // jdk8以后可以使用 Duration
        // .refreshAfterWrite(Duration.ofMinutes(10))
        .build(new CacheLoader<String, String>() {
            @Override
            public String load(String key) throws Exception {
                // 緩存加載邏輯
                ...
            }
    });
RateLimiter限流(https://zhuanlan.zhihu.com/p/38100340)
@Component("rateLimitInterceptor")
public class RateLimitInterceptor extends AbstractInterceptor {
    /**
     * 單機(jī)全局限流器(限制QPS為1)
     */
    private static final RateLimiter rateLimiter = RateLimiter.create(1);
    @Override
    protected ResponseEnum preFilter(HttpServletRequest request) {
        if (!rateLimiter.tryAcquire()) {
            System.out.println("限流中......");
            return ResponseEnum.RATE_LIMIT;
        }
        System.out.println("請(qǐng)求成功");
        return ResponseEnum.OK;
    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容