概述
工具類 就是封裝平常用的方法,不需要你重復(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;
}
}