Java8 Optional 使用方法详解

目录

前言

Optional容器类的常用方法及用法

1. Optional.of(T t)

2. Optional.empty() 

3. Optional.ofNullable(T t) 

4. isPresent()

5.ifPresent(Consumer consumer)

6. get() 

7. orElse(T t)

8. orElseGet(Supplier s)

9. orElseThrow(Supplier exceptionSupplier) 

10. map(Function f) 

11. filter(Predicate predicate)

12. map(Function mapper)

13. flatMap(Function mapper)

14.不要滥用

总结


前言

Optional 类(java.util.Optional) 是一个容器类,它可以保存类型T的值,代表这个值存在。或者仅仅保存null,表示这个值不存在。原来用 null 表示一个值不存在,现在 Optional 可以更好的表达这个概念。有利于注意避免空指针异常的问题。Optional提供很多有用的方法,这样我们就不用显式进行空值检测。

Optional容器类的常用方法及用法

1. Optional.of(T t)

创建一个Optional实例,如果 value 是 null,则抛出 NPE。

   Optional<Employee> op = Optional.of(new Employee());

  Employee emp = op.get();

  // 会在null处直接发生空指针异常

  Optional.of(null);

2. Optional.empty() 

创建一个空的Optional实例

  Optional<Employee> op = Optional.empty();

  // 会发生空指针异常

  System.out.println(op.get());

3. Optional.ofNullable(T t) 

若 t 不为null,创建Optional实例,否则创建空实例

   Optional<Employee> op = Optional.ofNullable(new Employee);

  System.out.println(op.get());

  Optional<Employee> op = Optional.ofNullable(null);

  // op.get()会发生空指针

  System.out.println(op.get());

4. isPresent()

判断是否包含值  

Optional<Employee> op = Optional.ofNullable(null);
  if(isPresent()) {
    System.out.println(op.get());
  }  
-------------
或者写法:
if (status.isPresent()) {
    System.out.println("Status: " + status.get());
}
//另一种简洁写法
status.ifPresent(System.out::println);

5.ifPresent(Consumer<? super T> consumer)

判断Optional中是否有值,如果有值,就执行Consumer接口的实现代码,并且该值会作为参数传给它。否则什么都不干

6. get() 

返回Optional中包装的值,注意:在判空之前,千万不要直接使用!

首先,get()不能直接使用,需要结合判空使用。这和!=null其实没多大区别,只是在表达和抽象上有所改善。

7. orElse(T t)

如果调用对象包含值,返回该值,否则返回指定的t。

Optional<Employee> op = Optional.ofNullable(null);
Employee emp = op.orElse(new Employee());

8. orElseGet(Supplier s)

如果调用对象包含值,返回该值,否则返回s获取的值

Optional<Employee> op = Optional.ofNullable(null);
// 参数是函数式接口 可以写想要的逻辑
Employee emp = op.orElseGet(e -> new Employee());

9. orElseThrow(Supplier<? extends X> exceptionSupplier) 

返回Optional中包装的值,取不到值时抛出指定的异常。

10. map(Function f) 

如果有值对其处理,并返回处理后的Optional,否则返回Optional.empty() 

Optional<Employee> op = Optional.ofNullable(new Employee());
Optional<String> str = op.map(e -> e.getName());

11. filter(Predicate<? super T> predicate)

过滤Optional中的值,断言通过返回原值,否则返回empty()。

  Optional<T> filter(Predicate<? super <T> predicate):如果值存在,并且这个值匹配给定的 predicate,返回一个Optional用以描述这个值,否则返回一个空的Optional。

12. map(Function<? super T, ? extend U> mapper)

转换Optional中的值。

13. flatMap(Function mapper)

与map类似,要求返回值必须是Optional  

Optional<Employee> op = Optional.ofNullable(new Employee());
// flatMap返回值必须 用Optional包装一下
Optional<String> str = op.flatMap(e -> Optional.of(e.getName()));
System.out.println(str.get());

14.不要滥用

有些简单明了的方法,完全没必要增加Optional来增加复杂性。

public String fetchStatus() {
    String status = getStatus() ;
    return Optional.ofNullable(status).orElse("PENDING");
}

//判断一个简单的状态而已
public String fetchStatus() {
    String status = ... ;
    return status == null ? "PENDING" : status;
}

首先,null 可以作为集合的元素之一,它并不是非法的;其次,集合类型本身已经具备了完整的空表达,再去包装一层Optional也是徒增复杂,收益甚微。例如,如集合map 已经有了getOrDefault()这样的类似orElse()的 API 了。

总结

Optional的出现使 Java 对 null 的表达能力更近了一步,好马配好鞍,合理使用可以避免大量的 NPE,节省大量的人力物力。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值