可以看我另一篇博客:【Java】Optional类入门使用-CSDN博客
回答重点
Optional类是Java8引入的一个容器类,用于处理可能为空的值。提供更简洁的API,提高代码可读性,来减少程序中出现null的情况,尽量避免NullPointerException(空指针异常)
Optional有两种状态,可以包含一个值,表示 "值存在",也可以为空,表示 "值为空"
扩展知识
基本方法
另一篇博客里都有,我这里截个图
Optional进一步分析
容器类,用来集中管理数据的类,Java中的集合、列表、映射(Map)、队列和栈都是容器类
常见的使用方式:
Optional<User> userOption = Optional.ofNullable(userService.getUser(...));
if (!userOption.isPresent()) {....}
架构师 Brian Goetz 解释Optional类的设计意图:
意思就是:Optional类给返回结果提供了一个表示无结果的值,而不是直接返回null
简单理解:就是一个外壳,里面放着原先的值,如果这个值是null,会进行包装(当然不是null也会包装)
网上比较流行的说法是Optional可以避免空指针,不过如果里面的值真是null,不做额外的判断,直接使用还是会有空指针的问题
倒不如说:最终的目的是拿到Optional里面存储的值
Optional的好处在于可以简化平日里一系列判断null的操作,使得用起来的时候看着不需要判断null,纵向丝滑,表现出来好像用Optional就不需要关心空指针的情况
而事实上Optional在替我们负重前行,该有的判断它替我们完成了,而且用了Optional最后拿结果的时候还是小心的,盲目直接get还是会抛错
看下面的场景能看出Optional的好处:
场景:找yes的地址所在省份,找不到就抛异常
Yes yes = getYes();
if (yes != null) {Address yesAddress = yes.getAddress();if (yesAddress != null) {Province province = yesAddress.getProvince();System.out.println(province.getName());}
}
throw new NoSuchElementException(); //如果没找到就抛错
如果用Optional
Optional.ofNullable(getYes()).map(a -> a.getAddress()).map(p -> p.getProvince()).map(n -> n.getName()).orElseThrow(NoSuchElementException::new);
不需要判空,就算address、province为空,也不会空指针异常,这就是Optional带来的好处!
相关博客:【Java】Java8的4个函数式接口简单教程-CSDN博客
【Java】Java8的Stream流入门使用-CSDN博客