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);
}
}