01 概述

Optional类主要是为了解决NPENullPointerException)空指针异常而产生的,在我看来它是 Java 实现函数式编程的一种很好的方式。

举个列子看看它的简单用法:

List<Order> list = Optional.ofNullable(orderList)
            .orElseThrow(() -> new RuntimeException("集合不能为空"))
            .stream()
            .sorted(Comparator.comparing(order -> order.getSort()))
            .collect(Collectors.toList());

下面来详细讲解它的用法。

02 Optional详细用法

首先建一个学生Student实体类:

@Data
public class Student {

    /**姓名**/
    private String name;

    /**年龄**/
    private Integer age;

    public Student(String name, Integer age) {
        this.name = name;
        this.age = age;
    }
}

初始化学生信息:

List<Student> studentList = new ArrayList<>();
studentList.add(new Student("张三", 33));
studentList.add(new Student("李四", 40));
studentList.add(new Student("王五", 23));
studentList.add(new Student("赵六", 55));
studentList.add(new Student("陆七", 32));
studentList.add(new Student("王八", 18));

ok,现在可以正式讲解Optional的用法了。

2.1 Optional下的方法

可以看到,Optional根据提示有三个初始化方法,分别是“ofNullable”、“of”、“empty”:
Java8 Optional详细解读_开发语言
它们的含义如下:

方法 描述
of(T value) 如果valuenull,那么会抛出空指针异常
ofNullable(T value) 如果valuenull,那么就会手动创建一个new Optional()
empty() 此方法返回此Optional类的空实例,就是不包含任何值

可以看到以上的三个方法都是初始化Optional实例而产生的,那么接下来以ofNullable(T value)方法为例子继续讲解。

2.1.1 ofNullable下的方法

可以看到使用ofNullable方法初始化完Optional实例后,有很多的方法,如下图:
Java8 Optional详细解读_开发语言_02
它们的含义如下:

方法 秒速
orElse(T other) 当只存在时返回值,不存在返回other(可以理解为自定义值,如字符串的内容)
orElseGet(Supplier<? extends T> other) 值存在返回值,值不存在返回other
orElseThrow() 当前值或当值为null抛出异常
filter() 主要是按条件过滤Optional实例
flatMap() streammap方法类似,都是对变量进行映射转换
map() flatMap差不多一个意思
get() 返回Optional类的实例的值
ifPresent() 检查实例是否存在,这种方式和null != obj没有区别

2.1.1.2 orElseThrow下的方法

orElseThrow下面的方法:
Java8 Optional详细解读_开发语言_03
可以看到下面有很多的方法,其实这些方法跟stream流表达是没有其它的区别,具体stream流方式可以参考之前我写的博客:

2.2 Optional完整实例

Optional完整示例如下:

List<Student> students = Optional.ofNullable(studentList)
                .orElseThrow(() -> new RuntimeException("学生集合不能为空"))
                .stream()
                .sorted(Comparator.comparing(student -> student.getAge().intValue()))
                .collect(Collectors.toList());

它主要做了几个事情:

  1. 初始化Optional
  2. 判断集合是否为空,如果为空,则抛出异常
  3. 使用了stream流特性
  4. 根据学生年龄从小打到排序
  5. 生成排序后的集合
03 文末

本文将收录到我的《Java专栏》,有兴趣的童鞋可以参阅下,本文完!