一拴袭、使用和避免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)建復雜的比較器,以完成集
合排序的功能乞巧。
從實現(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)建
Collections.sort(listString, Ordering.<String>natural());
Collections.sort(listString, Ordering.usingToString());
鏈式調(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)有若干操縱集合或元素值的方法: