Optional类是Java8引入的新类,用于解决臭名昭著的空指针异常(NullPointerException)。 Optional类实际上是一个容器,它可以保存类型T的值,或者仅仅保存null,Optional提供了很多有用的方法,避免了显式的空值检查。
How
创建方式
| 构造 | 描述 |
|---|---|
| Optional.of(T t) | 创建一个Optional实例,t不能为空,否则报错 |
| Optional.empty() | 创建一个空的Optional实例 |
| Optional.ofNullable(T t) | 若t不为空,创建Optional实例,否则创建空实例 |
API
| 方法 | 描述 |
|---|---|
| isPresent() | 判断是否包含值 |
| orElse(T t) | 如果调用对象包含值,返回该值,否则返回t |
| orElseGet(Supplier s) | 如果调用对象包含值,返回该值,否则返回s获取的值 |
| map(Function mapper) | 如果有值对其处理,并返回处理后的Optional,否则返回Optional.empty() |
| flatMap(Function mapper) | 与map类似,要求返回值必须是Optional |
| filter(Predicate predicate) | 过滤,按照predicate进行过滤,不符合规则则返回empty,也可以继续使用Optional的API |
| get() | 返回包装的对象 |
- 注意:使用Optional时不推荐直接调用其get()方法来获取对象,否则Optional类没啥意义,应该使用orElse()、orElseGet()、map()等方法来获取对象。
示例:
public class Order {String name;public String getOrderName(Order order ) {if (order == null) {return null;}return order.name;}}
用Optional初步改造:
public class Order {String name;public String getOrderName(Order order ) {Optional<Order> orderOptional = Optional.ofNullable(order);if (!orderOptional.isPresent()) {return null;}return orderOptional.get().name;}}
如果只改成这样,实质上并没有什么分别,事实上isPresent()与obj!=null无任何分别,并且再使用get()之前最好使用isPresent(),比如下面的代码再IDEA中会有警告:’Optional.get()’ wuthout ‘isPresent()’ check。
public void createOrder(String userName) {Optional optional = Optional.ofNullable(userName);optional.get();}
用Optional最终效果
public class Order {String name;public String getOrderName(Order order ) {return Optional.ofNullable(order).map(order1 -> order1.name).orElse(null);}}
