null会带来很多问题,从开始有null开始有无数程序栽在null的手里,null的含义是不清晰的,检查null在大多数情况下是不得不做的,而我们又在很多时候忘记了对null做检查,在我们的产品真正投入使用的时候,空指针异常出现了,这是一种讨厌的情况。
鉴于此google的guava库中提供了Optional接口来使null快速失败,即在可能为null的对象上做了一层封装,在使用Optional静态方法of时,如果传入的参数为null就抛出NullPointerException异常。
使用Optional除了简化粗鲁的if(null == object)、降低函数的复杂度、增加可读性之外,它是一种傻瓜式的防护,Optional引导编码人员主动的思考引用为null的情况。
1.Optional 创建实例
创建实例 | 描述 |
---|---|
Optional.of(T) | 若引用为null则快速失败,抛出异常 java.lang.NullPointerException |
Optional.absent() | 创建引用缺失的Optional实例 |
Optional.fromNullable(T) | 引用为null则表示缺失 |
2.Optional查询引用
常用方法 | 描述 |
---|---|
boolean isPresent() | 包含的引用非null的(引用存在),返回true |
T get() | 返回包含的内容,则抛出java.lang.IllegalStateException |
T or(T) | 返回包含的内容,如果为空,则返回指定的值 |
T orNull | 返回包含的内容,如果为空,则返回null |
Set asSet() | 如果引用存在,返回只有单一元素的集合;如果引用缺失,返回空集合。 |
Optional transform() | 引用存在,则它被转换给定的功能;否则absent()被返回。 |
Iterable presentInstances(Iterable> optionals) | 将参数optionals中为null的optional剔除,同时返回值对象的Iterable |
3.代码示例
1.基本用法
Optional<Integer> possible = Optional.fromNullable(5);//创建允许null值的Optional
System.out.println(possible.isPresent());
System.out.println(possible.get()); // 5
System.out.println(possible.or(3)); // 5
System.out.println(possible.orNull()); // 5
System.out.println(possible.asSet()); // [5]
2.presentInstances
List<Optional<Integer>> list = new ArrayList<>();
for (int index = 10; index > 0; --index) {
Integer t;
if (0 == index % 2) {
t = index;
} else {
t = null;
}
list.add(Optional.fromNullable(t));
}
Iterable<Integer> it = Optional.presentInstances(list);
it.forEach(System.err::println);
//输出结果为:
//10
//8
//6
//4
//2