guava

guava 模塊

Basic utilities

更方便的使用java

避免使用空值

reason:

95%的集合不應(yīng)該接受null值,快速失敗優(yōu)于接受null值

為何使用null?

null表達的意義不明確,e.g map.get(key) 返回null,可能代表map中包含了這個值為null,或者根本不包含這個key值.

option <T> :

創(chuàng)建一個option:
1. Optional.of(T) 返回一個非空的集合,如果是空會快速失敗
2. Optional.absent() 直接返回一個空對象
3. Optional.fromNullable(T) 返回一個可空的集合.
查詢方法:
1. boolean isPresent() 如果不為空返回true
2. T get() 返回包含的值,否則返回 IllegalStateException
3. T or(T) 返回包含的值,否則返回 default 值
4. T orNull() 返回包含的值,否則返回 null

考慮的關(guān)鍵點:

就算返回null, 在包裝之后調(diào)用方液必須考慮返回值為空的情況.

方便的使用方法:

1. 方便的使用默認值代替null
   Objects.firstNonNull(T, T) 返回第一個不為空的值,都為空,返回nullpointer.
2. 使用 option.or 可以代替上述方法.

Preconditions 先決條件

API 使用方式:

1. 直接拋出異常
    checkArgument(i >= 0);
2. 拋出額外的Object的message ,調(diào)用 extra object.toString
    checkArgument(i >= 0,"error Message");
3. 使用未知替換符 %s
    checkArgument(i < j, "Expected i < j, but %s > %s", i, j);
方法 描述 異常
checkArgument(boolean) 檢查參數(shù)是否是true IllegalArgumentException
checkNotNull(T) 檢查參數(shù)是否是null NullPointerException
checkState(boolean) 檢查當前對象的狀態(tài),與入?yún)o關(guān)的狀態(tài) IllegalStateException
checkElementIndex(int index, int size) 檢查當前未知是否在元素中 IndexOutOfBoundsException

Cache

example :

   LoadingCache<Key, Graph> graphs = CacheBuilder.newBuilder()
   .maximumSize(1000)
   .expireAfterWrite(10, TimeUnit.MINUTES)
   .removalListener(MY_LISTENER)
   .build(
       new CacheLoader<Key, Graph>() {
         public Graph load(Key key) throws AnyException {
           return createExpensiveGraph(key);
         }
   });

使用范圍:

cache 和 ConcurrentMap 很相似,但是也有區(qū)別.
ConcurrentMap 保存所有已插入的項目直到唄明確的移除.
cache 自動刪除內(nèi)存中過期的數(shù)據(jù).
LoadingCache 可以在內(nèi)存中沒有時,自動加載數(shù)據(jù)

* 使用更多的內(nèi)存,加快速遞
* 需要查詢多次相同的key值
* 不會使用過多的內(nèi)存.

使用方式:

是否可以使用去計算一個key值.
Y : 使用CacheLoader
N : 傳入Callable進入get方法
  1. 使用cacheLoader方式
這里內(nèi)部加載緩存的方法會拋出檢查性異常,會在get方法獲取時拋出ExecutionException.
LoadingCache<Key, Graph> graphs = CacheBuilder.newBuilder()
       .maximumSize(1000)
       .build(
           new CacheLoader<Key, Graph>() {
             public Graph load(Key key) throws AnyException {
               return createExpensiveGraph(key);
             }
           });

...
try {
  return graphs.get(key);
} catch (ExecutionException e) {
  throw new OtherException(e.getCause());
}

非檢查性異常方式:

LoadingCache<Key, Graph> graphs = CacheBuilder.newBuilder()
       .expireAfterAccess(10, TimeUnit.MINUTES)
       .build(
           new CacheLoader<Key, Graph>() {
             public Graph load(Key key) { // no checked exception
               return createExpensiveGraph(key);
             }
           });

...
return graphs.getUnchecked(key);
  1. 使用Callable:

    Cache<Key, Value> cache = CacheBuilder.newBuilder()
        .maximumSize(1000)
        .build(); // look Ma, no CacheLoader
    ...
    try {
      // If the key wasn't in the "easy to compute" group, we need to
      // do things the hard way.
      cache.get(key, new Callable<Value>() {
        @Override
        public Value call() throws AnyException {
          return doThingsTheHardWay(key);
        }
      });
    } catch (ExecutionException e) {
      throw new OtherException(e.getCause());
    }
    

過期策略:

  1. Size-based Eviction 基于大小的過期策略 :
    CacheBuilder.maximumSize(long) 大小不超過參數(shù)值.
    CacheBuilder.maximumWeight(long) 計算傳入?yún)?shù)的大小(內(nèi)存大小值等)
        LoadingCache<Key, Graph> graphs = CacheBuilder.newBuilder()
           .maximumWeight(100000)
           .weigher(new Weigher<Key, Graph>() {
              public int weigh(Key k, Graph g) {
                return g.vertices().size();
              }
            })
           .build(
               new CacheLoader<Key, Graph>() {
                 public Graph load(Key key) { // no checked exception
                   return createExpensiveGraph(key);
                 }
           }
        );
    
  2. 基于時間的過期策略:
    expireAfterAccess(long, TimeUnit) 基礎(chǔ)時間內(nèi)沒有訪問過
    expireAfterWrite(long, TimeUnit) 基礎(chǔ)時間內(nèi)有過創(chuàng)建或有過更改
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市鉴逞,隨后出現(xiàn)的幾起案子迁霎,更是在濱河造成了極大的恐慌脆霎,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,042評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件批幌,死亡現(xiàn)場離奇詭異,居然都是意外死亡氮趋,警方通過查閱死者的電腦和手機辜御,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評論 2 384
  • 文/潘曉璐 我一進店門诗力,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事苇本⊥嗉耄” “怎么了?”我有些...
    開封第一講書人閱讀 156,674評論 0 345
  • 文/不壞的土叔 我叫張陵瓣窄,是天一觀的道長笛厦。 經(jīng)常有香客問我,道長俺夕,這世上最難降的妖魔是什么裳凸? 我笑而不...
    開封第一講書人閱讀 56,340評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮劝贸,結(jié)果婚禮上姨谷,老公的妹妹穿的比我還像新娘。我一直安慰自己映九,他們只是感情好梦湘,可當我...
    茶點故事閱讀 65,404評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著件甥,像睡著了一般捌议。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上引有,一...
    開封第一講書人閱讀 49,749評論 1 289
  • 那天瓣颅,我揣著相機與錄音,去河邊找鬼譬正。 笑死宫补,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的曾我。 我是一名探鬼主播粉怕,決...
    沈念sama閱讀 38,902評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼您单!你這毒婦竟也來了斋荞?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,662評論 0 266
  • 序言:老撾萬榮一對情侶失蹤虐秦,失蹤者是張志新(化名)和其女友劉穎平酿,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體悦陋,經(jīng)...
    沈念sama閱讀 44,110評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡蜈彼,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了俺驶。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片幸逆。...
    茶點故事閱讀 38,577評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡棍辕,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出还绘,到底是詐尸還是另有隱情楚昭,我是刑警寧澤,帶...
    沈念sama閱讀 34,258評論 4 328
  • 正文 年R本政府宣布拍顷,位于F島的核電站抚太,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏昔案。R本人自食惡果不足惜尿贫,卻給世界環(huán)境...
    茶點故事閱讀 39,848評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望踏揣。 院中可真熱鬧庆亡,春花似錦、人聲如沸捞稿。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽括享。三九已至搂根,卻和暖如春珍促,著一層夾襖步出監(jiān)牢的瞬間铃辖,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評論 1 264
  • 我被黑心中介騙來泰國打工猪叙, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留娇斩,地道東北人。 一個月前我還...
    沈念sama閱讀 46,271評論 2 360
  • 正文 我出身青樓穴翩,卻偏偏與公主長得像犬第,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子芒帕,可洞房花燭夜當晚...
    茶點故事閱讀 43,452評論 2 348

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理歉嗓,服務(wù)發(fā)現(xiàn),斷路器背蟆,智...
    卡卡羅2017閱讀 134,628評論 18 139
  • 適用性緩存在很多情況下都是非常有用的鉴分。比如,我們需要多次根據(jù)給定的輸入獲取值带膀,而且該值計算或者獲取的開銷是非常昂貴...
    熊熊要更努力閱讀 833評論 0 0
  • Google Guava Cache是一種非常優(yōu)秀本地緩存解決方案志珍,提供了基于容量,時間和引用的緩存回收方式垛叨÷着矗基于...
    Acamy丶閱讀 25,821評論 3 34
  • com.google.common.cache 1、背景 緩存,在我們?nèi)粘i_發(fā)中是必不可少的一種解決性能問題的方法...
    拾壹北閱讀 22,256評論 0 25
  • 1 我坐在丫頭身后敛纲,拿著吹風機給她吹剛洗完的發(fā)喂击;長長的黑黑的頭發(fā)從我指縫中穿過,細細軟軟的淤翔,還是很直直的有營養(yǎng)的惭等。...
    木徒閱讀 1,901評論 2 0