null会带来不少问题,从开始有null开始有无数程序栽在null的手里,null的含义是不清晰的,检查null在大多数状况下是不得不作的,而咱们又在不少时候忘记了对null作检查,在咱们的产品真正投入使用的时候,空指针异常出现了,这是一种讨厌的状况。java
鉴于此google的guava库中提供了Optional接口来使null快速失败,即在可能为null的对象上作了一层封装,在使用Optional静态方法of时,若是传入的参数为null就抛出NullPointerException异常。函数
使用Optional除了简化粗鲁的if(null == object)、下降函数的复杂度、增长可读性以外,它是一种傻瓜式的防御,Optional引导编码人员主动的思考引用为null的状况。google
建立实例 | 描述 |
---|---|
Optional.of(T) | 若引用为null则快速失败,抛出异常 java.lang.NullPointerException |
Optional.absent() | 建立引用缺失的Optional实例 |
Optional.fromNullable(T) | 引用为null则表示缺失 |
经常使用方法 | 描述 |
---|---|
boolean isPresent() | 包含的引用非null的(引用存在),返回true |
T get() | 返回包含的内容,则抛出java.lang.IllegalStateException |
T or(T) | 返回包含的内容,若是为空,则返回指定的值 |
T orNull | 返回包含的内容,若是为空,则返回null |
Set
|
若是引用存在,返回只有单一元素的集合;若是引用缺失,返回空集合。 |
|
引用存在,则它被转换给定的功能;不然absent()被返回。 |
|
将参数optionals中为null的optional剔除,同时返回值对象的Iterable |
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]
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