Optional的用法属于函数式变成的范畴。它是把双刃剑,有时能极大的简化代码,但是有时也会降低代码的可读性,所以要视情况使用,最好不要用太复杂

Optional 类是一个可以为null的容器对象。如果值存在则isPresent()方法会返回true,调用get()方法会返回该对象。

Optional 是个容器:它可以保存类型T的值,或者仅仅保存null。Optional提供很多有用的方法,这样我们就不用显式进行空值检测

Optional 类的引入很好的解决空指针异常。

https://www.runoob.com/java/java8-optional-class.html
http://www.ibloger.net/article/3209.html

示例1 防止NPE或去除冗余null判断,注意map的用法

以前写法

  1. public String getCity(User user) throws Exception{
  2. if(user!=null){
  3. if(user.getAddress()!=null){
  4. Address address = user.getAddress();
  5. if(address.getCity()!=null){
  6. return address.getCity();
  7. }
  8. }
  9. }
  10. throw new Excpetion("取值错误");
  11. }

java8写法

  1. public String getCity(User user) throws Exception{
  2. return Optional.ofNullable(user)
  3. .map(u-> u.getAddress())
  4. .map(a->a.getCity())
  5. .orElseThrow(()->new Exception("取指错误"));
  6. }

注意map的写法
可直接多层map,最后再orElse

示例1.1 - 直接return 到外层方法的例子

  1. public static boolean isRankCity(String topListType) {
  2. return Optional.ofNullable(TopListEnum.getEnumByCode(topListType))
  3. .map(t -> t.isCityRank())
  4. .orElse(false);
  5. }

示例1.3 当源对象为list时的写法

  1. Optional.ofNullable(abstractMonitorObjs)
  2. .orElse(ImmutableList.of())
  3. .stream()
  4. .xxxx

示例二

比如,在主程序中

以前写法

  1. if(user!=null){
  2. dosomething(user);
  3. }

java8写法

  1. Optional.ofNullable(user).ifPresent( u -> {
  2. dosomething(u);
  3. }

String s = xx != ? : defaultString的替代

  1. public class OptionalTest {
  2. public static void main(String[] args) {
  3. String input = null;
  4. String timeZoneTag = Optional.ofNullable(input).orElse(TimeZoneTag.CTT);
  5. // 以下写法也OK
  6. //String timeZoneTag = Optional.ofNullable(input).orElseGet(() -> getDefault());
  7. System.out.println(timeZoneTag);
  8. }
  9. public static String getDefault() {
  10. return TimeZoneTag.CTT;
  11. }
  12. }

示例四:对可空的一个集合进行遍历

  1. if(!CollectionUtils.isEmpty(list)) {
  2. list.stream().foreach(r -> {
  3. });
  4. }
  5. 改为以下写法
  6. Optional.ofNullable(list).orElse(ImmutableList.of()).stream().......