Guava | 基本工具

一拴袭、使用和避免null

時間:2016年12月21日
練習:study.m1_1.mOptional.TestCase.java
1读第、為什么要避免使用null呢?
null的語義模糊:比如在map中稻扬,取得null值可能表示此鍵對應的值是null卦方,也可能表示無此鍵。
2泰佳、使用null的正確場景
null在性能和速度方面是廉價的盼砍。
3尘吗、Guava給出的措施
(1)Guava工具類對Null值都采用快速失敗操作;
(2)Guava還提供了很多工具類浇坐,可以更方便地用特定值替換Null值睬捶。
4、解決措施
(1)使用特殊值代替set或map中值為null的數(shù)對近刘;
(2)Guava用Optional<T>表示可能為null的T類型引用:
     Optional不會包含null引用擒贸,它只包含兩種,類型的引用:
     引用存在:非null的引用觉渴;
     引用缺失:沒有引用介劫。
5、使用optional的意義
* 使用Optional除了賦予null語義案淋,增加了可讀性座韵,最大的優(yōu)點在于它是一種傻瓜式的防護。
* Optional迫使你積極思考引用缺失的情況踢京,因為你必須顯式地從Optional獲取引用誉碴。
* 直接使用null很容易讓人忘掉某些情形,盡管FindBugs可以幫助查找null相關的問題瓣距,但是我們還是認為它并不能準確地定位問題根源黔帕。
* 如同輸入?yún)?shù),方法的返回值也可能是null蹈丸。
* 和其他人一樣成黄,你絕對很可能會忘記別人寫的方法method(a,b)會返回一個null,就好像當你實現(xiàn)method(a,b)時白华,
* 也很可能忘記輸入?yún)?shù)a可以為null慨默。將方法的返回類型指定為Optional贩耐,也可以迫使調(diào)用者思考返回的引用缺失的情形弧腥。
6、Optional的使用

** 創(chuàng)建Optional實例(以下都是靜態(tài)方法):**

  • Optional.of(T) 創(chuàng)建指定引用的Optional實例潮太,若引用為null則快速失敗
  • Optional.absent() 創(chuàng)建引用缺失的Optional實例
  • Optional.fromNullable(T) 創(chuàng)建指定引用的Optional實例管搪,若引用為null則表示缺失

** 用Optional實例查詢引用(以下都是非靜態(tài)方法):**

  • boolean isPresent() 如果Optional包含非null的引用(引用存在),返回true
  • T get() 返回Optional所包含的引用铡买,若引用缺失更鲁,則拋出java.lang.IllegalStateException
  • T or(T) 返回Optional所包含的引用,若引用缺失奇钞,返回指定的值
  • T orNull() 返回Optional所包含的引用,若引用缺失,返回null
  • Set<T> asSet() 返回Optional所包含引用的單例不可變集诸典,如果引用存在,返回一個只有單一元素的集合顶别,如果引用缺失,返回一個空集合拒啰。
7驯绎、其他處理null的便利方法
(1)當需要一個默認值來替換可能會出現(xiàn)的null值,那么可以使用Optional.fromNullable(first).or(second)谋旦,如果兩個值都是null剩失,該方法會拋出NullPointerException。
(2)還有其它一些方法專門處理null或空字符串:emptyToNull(String)册着,nullToEmpty(String)拴孤,isNullOrEmpty(String)。

二甲捏、Ordering:流暢風格比較器

排序器Ordering是 Guava 流暢風格比較器Comparator的實現(xiàn),它可以用來為構(gòu)建復雜的比較器,以完成集
合排序的功能乞巧。

Ordering是Comparator的實現(xiàn)

從實現(xiàn)上說,Ordering 實例就是一個特殊的 Comparator 實例。Ordering 把很多基于 Comparator 的靜態(tài)方
法(如 Collections.max)包裝為自己的實例方法(非靜態(tài)方法),并且提供了鏈式調(diào)用方法,來定制和增強現(xiàn)
有的比較器摊鸡。

1绽媒、創(chuàng)建Ordering

方法1:由下面的靜態(tài)方法創(chuàng)建

靜態(tài)方法創(chuàng)建
Collections.sort(listString, Ordering.<String>natural());
Collections.sort(listString, Ordering.usingToString());

鏈式調(diào)用方法:通過鏈式調(diào)用,可以由給定的排序器衍生出其它排序器

鏈式調(diào)用方法
Collections.sort(listString, Ordering.<String>natural().<String>reverse());

方法2:跳過實現(xiàn) Comparator,而直接繼承 Ordering

    // 創(chuàng)建Ordering :直接繼承Ordering
    Ordering ordering1 = new Ordering<String>() {
        @Override
        public int compare(String left, String right) {
            return left.compareTo(right);
        }
    };

    // 例如,你需要下面這個類的排序器。
    class Foo {
        @Nullable String sortedBy;
        int notSortedBy;
    }
    // 考慮到排序器應該能處理 sortedBy 為 null 的情況,我們可以使用下面的鏈式調(diào)用來合成排序器:
    Ordering<Foo> ordering = Ordering.natural().nullsFirst().onResultOf(new Function<Foo, String>() {
        public String apply(Foo foo) {
            return foo.sortedBy;
        }
    });
2免猾、運用排序器

Guava 的排序器實現(xiàn)有若干操縱集合或元素值的方法:

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末是辕,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子猎提,更是在濱河造成了極大的恐慌获三,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,332評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件锨苏,死亡現(xiàn)場離奇詭異疙教,居然都是意外死亡,警方通過查閱死者的電腦和手機伞租,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,508評論 3 385
  • 文/潘曉璐 我一進店門贞谓,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人葵诈,你說我怎么就攤上這事裸弦。” “怎么了作喘?”我有些...
    開封第一講書人閱讀 157,812評論 0 348
  • 文/不壞的土叔 我叫張陵理疙,是天一觀的道長。 經(jīng)常有香客問我泞坦,道長窖贤,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,607評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮赃梧,結(jié)果婚禮上择吊,老公的妹妹穿的比我還像新娘。我一直安慰自己槽奕,他們只是感情好几睛,可當我...
    茶點故事閱讀 65,728評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著粤攒,像睡著了一般所森。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上夯接,一...
    開封第一講書人閱讀 49,919評論 1 290
  • 那天焕济,我揣著相機與錄音,去河邊找鬼盔几。 笑死晴弃,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的逊拍。 我是一名探鬼主播上鞠,決...
    沈念sama閱讀 39,071評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼芯丧!你這毒婦竟也來了芍阎?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,802評論 0 268
  • 序言:老撾萬榮一對情侶失蹤缨恒,失蹤者是張志新(化名)和其女友劉穎谴咸,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體骗露,經(jīng)...
    沈念sama閱讀 44,256評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡岭佳,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,576評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了萧锉。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片珊随。...
    茶點故事閱讀 38,712評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖驹暑,靈堂內(nèi)的尸體忽然破棺而出玫恳,到底是詐尸還是另有隱情,我是刑警寧澤优俘,帶...
    沈念sama閱讀 34,389評論 4 332
  • 正文 年R本政府宣布,位于F島的核電站掀序,受9級特大地震影響帆焕,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,032評論 3 316
  • 文/蒙蒙 一叶雹、第九天 我趴在偏房一處隱蔽的房頂上張望财饥。 院中可真熱鬧,春花似錦折晦、人聲如沸钥星。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,798評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽谦炒。三九已至,卻和暖如春风喇,著一層夾襖步出監(jiān)牢的瞬間宁改,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,026評論 1 266
  • 我被黑心中介騙來泰國打工魂莫, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留还蹲,地道東北人。 一個月前我還...
    沈念sama閱讀 46,473評論 2 360
  • 正文 我出身青樓耙考,卻偏偏與公主長得像谜喊,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子倦始,可洞房花燭夜當晚...
    茶點故事閱讀 43,606評論 2 350

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

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理锅论,服務發(fā)現(xiàn),斷路器楣号,智...
    卡卡羅2017閱讀 134,637評論 18 139
  • 1. Java基礎部分 基礎部分的順序:基本語法最易,類相關的語法,內(nèi)部類的語法炫狱,繼承相關的語法藻懒,異常的語法,線程的語...
    子非魚_t_閱讀 31,599評論 18 399
  • 從三月份找實習到現(xiàn)在视译,面了一些公司嬉荆,掛了不少,但最終還是拿到小米酷含、百度鄙早、阿里、京東椅亚、新浪限番、CVTE、樂視家的研發(fā)崗...
    時芥藍閱讀 42,217評論 11 349
  • 國家電網(wǎng)公司企業(yè)標準(Q/GDW)- 面向?qū)ο蟮挠秒娦畔?shù)據(jù)交換協(xié)議 - 報批稿:20170802 前言: 排版 ...
    庭說閱讀 10,934評論 6 13
  • 對于集合來說呀舔,排序是一個很常見的操作弥虐,Java已經(jīng)提供了一系列排序的方法,如Collections中的靜態(tài)方法...
    ChimeEmail團隊閱讀 1,843評論 0 2