JKD8 Optional类,JAVA 代码整洁的语法糖

  1. 前言与介绍:
    1. Optional类是JDK8提供的一套新的API,这个类是一个对象的容器,对容器中的对象进行一些避免空值的操作,并且支持链式的调用,对容器中的对象进行进一步的处理。
    2. 当然不使用这个类也可以去编码去做任何事,就像Stream类一样,你可以自己去编码去做事,这个类的意义更多是整洁代码,规避空值,让代码避免大量的if-else。
    3. 在我刚开始学习使用JDK8时对这个类我是嗤之以鼻的,认为没有意义的,但是当随着Lambda的使用越来越多与熟练,对代码的简洁规范了解越来越深以后,我会觉得这个类很好用很好用,很方便。
  2. 正文:
    1. 起因是看到了一段同事的代码,让我对这个类起了好奇心,翻看了一下源码(源码实现很简单,有兴趣的可以自行阅读一下哈)
    2. Optional.ofNullable(map.get(id))
              .ifPresent(objInMap -> obj.setName(objInMap.getName()));
      // 等价于
      Obj objInMap = map.get(id);
      if(objInMap !=null){
          obj.setName(objInMap.getName();
      } 
    3. 简化了一下业务代码。ofNullable( )构造一个Optional对象,容器中的对象是map里的value,该方法value为空时不会报错。ifPresent( )方法是当Optional容器中的对象不为空时执行传的逻辑。

    4. Optional源码中可以看到ifPresent( ),需要的参数是一个Consumer类,类上加了@FunctionalInterface表名该类是一个函数式接口(只有一个抽象方法的接口)。

    5. accept( )方法可以理解为一个消费者,是有入参但是没有返回的,因此在ifPresent( )方法里使用的方法或者逻辑是不能有返回值的,否则会有检查型异常。

    6.  Optional类似Streaml类有一个链式调用的方法,包括filter( )、map( )、flatMap()。

      1. Function也是一个函数式接口,apply方法是一个有入参与返参的方法。
      2. flatMap与map最大的区别就是不可以为null,会报错。
      3. map对容器内容做处理,如果当前容器的内容为空直接返回空的Option,否则执行给定的逻辑并且返回值,可以为null。因为返回的是一个Optional因此map可以连续调用。
      4. filter可以过滤容器中的元素,如果元素不符合判定条件返回一个容器内对象为空的Optional。
    7. 贴下我的一段代码
    8. @Autowired
      private IServiceService serviceService;
      
      Map<Long, SysService> map = Optional.ofNullable(map.get(id))
              .map(idsInMap -> serviceService.findByIds(idsInMap).stream().collect(Collectors.toMap(SysService::getId, Function.identity())))
              .map(````) // 仅用作实例
              .orElseGet(Collections::emptyMap);
      // 等价于
      List<Long> idsInMap = map.get(id);
      if(CollectionUtil.isNotEmpty(idsInMap)){
          Map<Long, SysService> map = serviceService.findByIds(idsInMap).stream().collect(Collectors.toMap(SysService::getId, Function.identity()));
          if(MapUtil.isNotEmpty(map)){
              ````    
          }else{
              ```    
          }
      }else{
          Map<Long, SysService> map = Collections::emptyMap;
      }

    9. 源码:
    10. Optional简化了很多if-else,代码整洁性与可读性更高,更优雅的编码方式,Optional类是个很好用的语法糖,可以多加使用的。

     码字不易,大佬们觉得文章有帮助,动动小手点个赞支持一下,蟹蟹!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值