第一篇:Optional的使用
java中最容易出現(xiàn)的錯誤,莫過于
NullPointException
,23種設計模式坏匪,還專門為此提出了空對象設計模式
我們看如下兩種風格:
//A
public void sayHelloA(String name) {
if (name == null) {
System.out.println("name = " + "無名氏");
}
System.out.println("name = " + name);
}
//B
public void sayHelloB(String name) {
name = Optional.fromNullable(name).or("無名氏");
System.out.println("name = " + name);
}
可以看出B寫的代碼拟逮,至少有兩種優(yōu)點
1、代碼更優(yōu)雅适滓,一般情況下可以替代空對象設計模式(用isPresent()的時候比敦迄!=null更加語義化)。
2凭迹、提醒人們對于null的判斷罚屋,這點很重要,很多錯誤都是這里引起的嗅绸。
下面列舉了一下常用的方法:
Optional<T>.of(T) | 為Optional賦值脾猛,當T為Null直接拋NullPointException,建議這個方法在調用的時候直接傳常量,不要傳變量 |
---|---|
Optional<T>.fromNullable(T) | 為Optional賦值鱼鸠,當T為Null則使用默認值猛拴。建議與or方法一起用,風騷無比 |
Optional<T>.absent() | 為Optional賦值蚀狰,采用默認值 |
T or(T) | 返回optional的值愉昆,當Optional的值為null時,使用or賦予的值返回麻蹋。與fromNullable是一對好基友 |
T get() | 當Optional的值為null時跛溉,拋出IllegalStateException,返回Optional的值 |
boolean isPresent() | 如果Optional存在值哥蔚,則返回True |
T orNull() | 當Optional的值為null時倒谷,則返回Null。否則返回Optional的值 |
Set<T> asSet() | 將Optional中的值轉為一個Set返回糙箍,當然只有一個值啦渤愁,或者為空,當值為null時深夯。 |
下面給出一些代碼示例:
import com.google.common.base.Optional;
public class GuavaTester {
public static void main(String args[]){
GuavaTester guavaTester = new GuavaTester();
Integer value1 = null;
Integer value2 = new Integer(10);
//Optional.fromNullable - allows passed parameter to be null.
Optional<Integer> a = Optional.fromNullable(value1);
//Optional.of - throws NullPointerException if passed parameter is null
Optional<Integer> b = Optional.of(value2);
System.out.println(guavaTester.sum(a,b));
}
public Integer sum(Optional<Integer> a, Optional<Integer> b){
//Optional.isPresent - checks the value is present or not
System.out.println("First parameter is present: " + a.isPresent());
System.out.println("Second parameter is present: " + b.isPresent());
//Optional.or - returns the value if present otherwise returns
//the default value passed.
Integer value1 = a.or(new Integer(0));
//Optional.get - gets the value, value should be present
Integer value2 = b.get();
return value1 + value2;
}
}
參考資料:
極客學院:http://wiki.jikexueyuan.com/project/google-guava-official-tutorial/use-and-ignore-null.html
Guava Optional 的應用 https://my.oschina.net/readjava/blog/309265