Java8新特性——Optional
Java8 Optional
Optional是一个包装类。类中包装的对象可以为null
也可以为非null
,简单来讲就是把null
封装了一层, 防止出现空指针异常
Optional优化null判断
看一段代码:
1 | public static String getAge(Student student){ |
该方法获取学生年龄,为了防止Student对象为空,做了防御性检查,我们可以使用Optional优化该段代码
1 | public static String getAge(Student student){ |
可以看到,Optional结合Lambda表达式,可以让代码看起来更加优雅
创建Optional对象
1 | public final class Optional<T> { |
可以看到Optional类的构造方法设置为了私有,所以不能通过new
来创建,它提供了三个静态方法来创建Optional对象,of(T value)
、ofNullable(T value)
、empty(T value)
of(T value)
:创建一个包装值非null
的Optional对象ofNullable(T value)
:创建一个包装值可以为null
的Optional对象empty(T value)
:创建一个包装值为null
的Optional对象
Optional类的常用方法
T get()
:获取Optional对象的包装值,如果包装值为null
,则抛出NoSuchElementException("No value present");
异常boolean isPresent()
:判断Optional对象的包装值是否为null
void ifPresent(Consumer<? super T> consumer)
:如果Optional包装值不为null
,则执行一些动作,否则什么也不做Optional<T> filter(Predicate<? super T> predicate)
:filter
接受一个Predicate
对象,可以实现对Optional对象包装值的过滤,如果满足条件则返回该Optional对象,不满足则返回空Optional对象Optional<U> map(Function<? super T, ? extends U> mapper)
:map
方法传入一个函数进行运算,如果Optional对象的包装值为null
,或经过函数运算后返回值为null
则返回一个包装值为null
的Optional对象,否则返回经函数处理后的Optional对象,包装对象的类型可能改变1
Optional<Integer> map = Optional.ofNullable(student).map(Student::getAge);
Optional<U> flatMap(Function<? super T, Optional<U>> mapper)
:flatMap
方法类似于map
方法,但是该方法可以返回一个新的Optional对象,举例如下:1
2Optional<Integer> flatmap = Optional.ofNullable(student)
.flatMap(s-> Optional.ofNullable(s.getAge()));注意:
flatmap
和map
的区别是map
方法返回值自动封装为Optional对象,而flatmap
方法需要手动封装为Optional对象T orElse(T other)
:如果Optional对象包装值不为null
则返回包装值,否则返回other
T orElseGet(Supplier<? extends T> other)
:与orElse
的区别是将Supplier
的get
方法的返回值作为默认值T orElseThrow(Supplier<? extends X> exceptionSupplier)
:Optional对象包装值为null
时,抛出异常,示例:1
Optional.ofNullable(student).map(u -> u.getAge()).orElseThrow(() -> new RuntimeException("Unkown"));