01 概述
Optional类主要是为了解决NPE
(NullPointerException
)空指针异常而产生的,在我看来它是 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
”:
它们的含义如下:
方法 | 描述 |
of(T value) | 如果value 是null ,那么会抛出空指针异常 |
ofNullable(T value) | 如果value 为null ,那么就会手动创建一个new Optional() |
empty() | 此方法返回此Optional 类的空实例,就是不包含任何值 |
可以看到以上的三个方法都是初始化Optional
实例而产生的,那么接下来以ofNullable(T value)
方法为例子继续讲解。
2.1.1 ofNullable下的方法
可以看到使用ofNullable
方法初始化完Optional实例后,有很多的方法,如下图:
它们的含义如下:
方法 | 秒速 |
orElse(T other) | 当只存在时返回值,不存在返回other(可以理解为自定义值,如字符串的内容) |
orElseGet(Supplier<? extends T> other) | 值存在返回值,值不存在返回other |
orElseThrow() | 当前值或当值为null抛出异常 |
filter() | 主要是按条件过滤Optional实例 |
flatMap() | 和stream 的map 方法类似,都是对变量进行映射转换 |
map() | 与flatMap 差不多一个意思 |
get() | 返回Optional 类的实例的值 |
ifPresent() | 检查实例是否存在,这种方式和null != obj 没有区别 |
2.1.1.2 orElseThrow下的方法
orElseThrow
下面的方法:
可以看到下面有很多的方法,其实这些方法跟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());
它主要做了几个事情:
- 初始化Optional
- 判断集合是否为空,如果为空,则抛出异常
- 使用了stream流特性
- 根据学生年龄从小打到排序
- 生成排序后的集合
03 文末
本文将收录到我的《Java专栏》,有兴趣的童鞋可以参阅下,本文完!