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()等方法来获取对象。

示例:

  1. public class Order {
  2. String name;
  3. public String getOrderName(Order order ) {
  4. if (order == null) {
  5. return null;
  6. }
  7. return order.name;
  8. }
  9. }
  1. 用Optional初步改造:

    1. public class Order {
    2. String name;
    3. public String getOrderName(Order order ) {
    4. Optional<Order> orderOptional = Optional.ofNullable(order);
    5. if (!orderOptional.isPresent()) {
    6. return null;
    7. }
    8. return orderOptional.get().name;
    9. }
    10. }
  2. 如果只改成这样,实质上并没有什么分别,事实上isPresent()与obj!=null无任何分别,并且再使用get()之前最好使用isPresent(),比如下面的代码再IDEA中会有警告:’Optional.get()’ wuthout ‘isPresent()’ check。

    1. public void createOrder(String userName) {
    2. Optional optional = Optional.ofNullable(userName);
    3. optional.get();
    4. }
  3. 用Optional最终效果

    1. public class Order {
    2. String name;
    3. public String getOrderName(Order order ) {
    4. return Optional.ofNullable(order).map(order1 -> order1.name).orElse(null);
    5. }
    6. }