全篇简介
这一篇讲一讲Java8中的 Optional 类,它是一个针对空指针异常处理的很好的容器。它可以存放NULL值或是相对类型的数值,所以我们就不用显式进行空值检测。
类的声明
public final class Optional<T>
extends Object
类的方法
当然这个类具有10+种不同效果的方法,我们先逐一介绍再附上代码重点介绍几个常用的方法。
1. of(T value)
为非null的值创建一个Optional。创建对象时传入的参数不能为null。如果传入参数为null,则抛出NullPointerException 。
Optional<Integer> number = Optional.of(10);
Optional<Integer> someNull = Optional.of(null);
//这种情况下会抛出异常NullPointerException
2. ofNullable(T value)
为指定的值创建一个Optional,如果指定的值为null,则返回一个空的Optional。可以接受参数为null的情况
Optional empty = Optional.ofNullable(null);
//在ofNullable(T value)方法中是可以传入null的
3. empty()
返回一个空的 Optional实例。
Optional<Integer> number = Optional.empty();
//这个很简单就是返回一个空的Optional实例对象
4. isPresent()
如果值存在返回true,否则返回false。
if (number.isPresent()) {
System.out.println(number.get());
}
5. get()
如果Optional有值则将其返回,否则抛出NoSuchElementException。
6. ifPresent(Consumer<? super T> consumer)
如果存在值,则使用该值调用指定的Consumer类,否则不执行任何操作。
7. orElse(T other)
如果有值则将其返回,否则返回指定的其它值other。如果Optional实例有值则将其返回,否则返回orElse方法传入的参数
System.out.println(empty.orElse("There is no value present!"));
//因为empty为null,所以结果很明显是There is no value present!
System.out.println(number.orElse("There is some value!"));
//因为number不为空,所以结果应该为10
8. orElseGet(Supplier<? extends T> other)
orElseGet与orElse方法类似,区别在于得到的默认值。orElse方法将传入的字符串作为默认值,orElseGet方法可以接受Supplier接口的实现用来生成默认值。
9. orElseThrow(Supplier<? extends X> exceptionSupplier)
如果有值则将其返回,否则抛出supplier接口创建的异常。
10. map(Function<? super T,? extends U> mapper)
如果有值,则对其执行调用mapping函数得到返回值。如果返回值不为null,则创建包含mapping返回值的Optional作为map方法返回值,否则返回空Optional。 map方法的mapping函数返回值可以是任何类型T
11. flatMap(Function<? super T,Optional< U >> mapper)
如果有值,为其执行mapping函数返回Optional类型返回值,否则返回空Optional。flatMap与map(Funtion)方法类似,区别在于flatMap中的mapper返回值必须是Optional。调用结束时,flatMap不会对结果用Optional封装。flatMap方法的mapping函数必须是Optional。
12. filter(Predicate<? super T> predicate)
filter个方法通过传入限定条件对Optional实例的值进行过滤。文档描述:如果有值并且满足断言条件返回包含该值的Optional,否则返回空Optional
13. equals(Object obj)
判断其他对象是否等于 Optional。
System.out.println(number.equals(empty));
//由于empty为空,显然返回false
14. hashCode()
返回存在值的哈希码,如果值不存在 返回 0。
15. toString()
返回一个Optional的非空字符串,用来调试
实例
package test;
import java.util.Optional;
public class t2 {
public static void main(String args[]){
Integer value1 = null;
Integer value2 = new Integer(10);
Optional<Integer> a = Optional.ofNullable(value1);
Optional<Integer> b = Optional.of(value2);
System.out.println("第一个参数值存在: " + a.isPresent());
System.out.println("第二个参数值存在: " + b.isPresent());
Integer value11 = a.orElse(new Integer(0));
Integer value22 = b.get();
System.out.println(value11+value22);
}
}
输出结果:
第一个参数值存在: false
第二个参数值存在: true
10
总结
这应该是我这段时间做的最后一篇Java8新特性的读书笔记,后续可能会看需求更新,但是就这几篇写下来,总让我感觉我越学越学不会Java了,太难了我。