第一篇:Optional的使用
java中最容易出现的错误,莫过于
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写的代码,至少有两种优点
1、代码更优雅,一般情况下可以替代空对象设计模式(用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