如何避免代码中粗鲁的null判断 ,即Option<T>的价值?
使用Optional<T>除了简化粗鲁的if(null == object)、降低函数的复杂度、增加可读性之外,它是一种傻瓜式的防护,Optional<T>引导编码人员主动的思考引用为
null
的情况。
准备工作
官方仓库:https://github.com/google/guava
在线wiki:https://github.com/google/guava/wiki
Optional<T>简介
com.google.common.base.Optional
允许接受可能为null的T类型的引用
1.Optional<T>
创建实例
创建实例 | 描述 |
---|---|
Optional.of(T) |
若引用为null则快速失败 java.lang.NullPointerException
|
Optional.absent() |
创建引用缺失的Optional实例 |
Optional.fromNullable(T) |
引用为null则表示缺失 |
2.Optional<T>
查询引用
常用方法 | 描述 |
---|---|
boolean isPresent() |
包含的引用非null的(引用存在),返回true |
T get() |
包含的引用缺失,则抛出java.lang.IllegalStateException
|
T or(T) |
包含的引用缺失,返回指定的值 |
T orNull |
包含的引用缺失,返回null |
Set<T> asSet() |
如果引用存在,返回只有单一元素的集合;引用缺失,返回空集合。 | |
<V> Optional<V> transform() |
引用存在,则它被转换给定的功能;否则absent()被返回。 | |
<T> Iterable<T> presentInstances(Iterable<? extends Optional<? extends T>> optionals) |
将参数optionals中为null的optional剔除,同时返回值对象的Iterable | |
代码示例
1.基本用法
Optional<Integer> possible = Optional.fromNullable(5); //创建允许null值的Optional
possible.isPresent();
possible.get(); // 5
possible.or(3)); // 5
possible.orNull(); // 5
possible.asSet(); // [5]
2.abstract <V> Optional<V> transform(Function<? super T,V> function)
用法介绍
根据Optional中的实例进行功能转化,如下例子可以看出:当创建的Optional中的reference为100的时候,执行该段代码会进入到apply函数,根据reference进行功能函数切换最终返回一个新的Optional<Boolean>
对象;当reference为null的时候,在Optional.fromNullable
创建的时候直接创建的Optional.<T>absent()
执行get方法就会跑出异常java.lang.IllegalStateException: Optional.get() cannot be called on an absent value
Optional<Integer> possible = Optional.fromNullable(100);
Optional<Boolean> t = possible.transform(new Function<Integer, Boolean>() {
public Boolean apply(Integer input) {
return 100 != input ? Boolean.TRUE : Boolean.FALSE;
}
});
t.get(); // false
3.static <T> Iterable<T> presentInstances(Iterable<? extends Optional<? extends T>> optionals)
如果实例存在,则它被转换给定的功能;否则absent()被返回。
List<Optional<Integer>> list = new ArrayList<Optional<Integer>>();
for (int index = 10; index > 0; --index) {
Integer t;
if (0 == index % 2) {
t = index;
} else {
t = null;
}
list.add(Optional.<Integer>fromNullable(t));
}
Iterable<Integer> it = Optional.presentInstances(list);
it.forEach(new Consumer<Integer>() {
public void accept(Integer integer) {
System.err.println(integer);
}
});
//输出结果
//10
//8
//6
//4
//2