- 前言与介绍:
- Optional类是JDK8提供的一套新的API,这个类是一个对象的容器,对容器中的对象进行一些避免空值的操作,并且支持链式的调用,对容器中的对象进行进一步的处理。
- 当然不使用这个类也可以去编码去做任何事,就像Stream类一样,你可以自己去编码去做事,这个类的意义更多是整洁代码,规避空值,让代码避免大量的if-else。
- 在我刚开始学习使用JDK8时对这个类我是嗤之以鼻的,认为没有意义的,但是当随着Lambda的使用越来越多与熟练,对代码的简洁规范了解越来越深以后,我会觉得这个类很好用很好用,很方便。
- 正文:
- 起因是看到了一段同事的代码,让我对这个类起了好奇心,翻看了一下源码(源码实现很简单,有兴趣的可以自行阅读一下哈)
-
Optional.ofNullable(map.get(id)) .ifPresent(objInMap -> obj.setName(objInMap.getName())); // 等价于 Obj objInMap = map.get(id); if(objInMap !=null){ obj.setName(objInMap.getName(); }
-
简化了一下业务代码。ofNullable( )构造一个Optional对象,容器中的对象是map里的value,该方法value为空时不会报错。ifPresent( )方法是当Optional容器中的对象不为空时执行传的逻辑。
-
Optional源码中可以看到ifPresent( ),需要的参数是一个Consumer类,类上加了@FunctionalInterface表名该类是一个函数式接口(只有一个抽象方法的接口)。
-
accept( )方法可以理解为一个消费者,是有入参但是没有返回的,因此在ifPresent( )方法里使用的方法或者逻辑是不能有返回值的,否则会有检查型异常。
-
Optional类似Streaml类有一个链式调用的方法,包括filter( )、map( )、flatMap()。
- Function也是一个函数式接口,apply方法是一个有入参与返参的方法。
- flatMap与map最大的区别就是不可以为null,会报错。
- map对容器内容做处理,如果当前容器的内容为空直接返回空的Option,否则执行给定的逻辑并且返回值,可以为null。因为返回的是一个Optional因此map可以连续调用。
- filter可以过滤容器中的元素,如果元素不符合判定条件返回一个容器内对象为空的Optional。
- 贴下我的一段代码
-
@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; }
- 源码:
- Optional简化了很多if-else,代码整洁性与可读性更高,更优雅的编码方式,Optional类是个很好用的语法糖,可以多加使用的。
码字不易,大佬们觉得文章有帮助,动动小手点个赞支持一下,蟹蟹!
JKD8 Optional类,JAVA 代码整洁的语法糖
于 2023-04-13 11:23:47 首次发布