首发于学习笔记

Java8新特性 Optional的正确使用姿势

Java8的新特性提供了一个可以容纳null的容器类,可以很好的解决空指针异常等情况,用处极大。

简介

Optional类是一个容器类,它可以保存模板类型T的值,也可以保存null。

——如果值存在,调用isPresent()返回ture,这时调用get()即可返回容器中保存的对象,通过这种方式我们就不需要单独进行空指针异常,还方便了函数式编程


有什么用?

思考一下:为什么说解决了空指针异常的问题?

在Java8以前,在调用对象时都需要验证其是否为null,像这种方式很有可能导致空指针异常:

String name = student.getInfo().getName();

为了避免抛出异常,需要进行验证:

{
....
if(student!=null){
    Info info = student.getInfo();
    if(info!=null){
        String name = info.getName();
        return name;
    }
}
...
}

太麻烦了!!

而JDK8所引入的Optional类可以让一切变得简单。

不信?Show you the code:

{
......
    Student student =Student().builder()......build();
    Optional<Student> studentOp=Optional.ofNullable(student);
    
    Info info = new Info();
    studentOp.ifPresent(stu->{info =stu.getInfo();};
...
}

如上所示,optional提供了一种简洁的避免空指针异常,以及优雅地获取容器类值的方式,并且还支持lambda函数式编程

其他方法

来看看Optional还有其他哪些值得一提的API。

of及ofNull

用Optional实例.of()的操作只能接受非空参数,否则会报空指针异常;

而用.ofNullable()则没有这样的限制,空与非空都可接受,根据实际场景来选择:

Student student=null;

//会报错
Optional<Student> stuOp=Optional.of(student); 
//不会报错
Optional<Student> stuOp=Optional.ofNullable(student); 

由于ofNullable在空值的时候也可以正常接收,因此在使用的时候要注意到底允不允许这样的null值存在,并且在使用前可以使用下面的API进行验证。

isPresent、ifPresent

isPresent()可以用来验证Optional实例中的值是否有值,若为null则返回false,其实isPresent就等同于一个对Optional容器中对象的if语句

ifPresent()是一种函数式编程接口:如果Optional中为非null,则调用consumer函数。consumer是指继承自Consumer类的抽象方法,可以对传入的数据进行处理,另外可以直接使用lambda表达式

形如上式的:

studentOp.ifPresent((stu)->{info =stu.getInfo()});

如果studentOp中的Student对象不为null,则将该对象作为stu进行相应的运算,大大简化了程序

get

该方法用来返回Optional中的值,如果为null,则会抛出异常:NoSuchElementException、

orElse与orElseGet

orElse用来返回Optional实例中的值,如果为null,则返回给定的值。如:

studentOp.orElse(println("hello!"));

orElseGet则有一些不同,orElseGet支持使用lambda表达式,实现自定义输出

map

map方法可以实现对Optional实例进行连续操作,如果optional中有值,就调用mapping函数得到返回值。且若返回值不为null,则返回的是包含mapping函数返回值值的Optional。否则返回空Optional。

map函数可以使用lambda表达式。map函数可以说是用处极大,并且结合orElse或者ifPresent可以实现酷炫的函数式编程。简单给个例子如下:

.......studentOp....
prtintln(studentOp.map((info)->info.setName("I'm xiaoming")).orElse("I'm King!"));

发布于 2021-05-27 21:55