正确使用Java8中的Optional,它远比我们想象的优秀

网站建设3年前发布
24 00

我常说学习一定要有目的,首先发现问题,或者不便之处,然后寻找解决方案,解决方案可能有很多,我们要选择好的方法来使用,这篇文章介绍JDK8推出的Optional容器,会从以下几点展开:,由此一起来认识Optional的正确使用方式,远比我们想象的强大,好用,看很多文章和教程都在讲API,个人感觉调用一个方法谁不会?它到底好在哪才是最重要的,我发布的文章都秉承发现问题,解决问题的理念展开,好了,不吹了,精彩的要来了!,作为Java程序员遇到NullPointerException是非常痛苦的,这可能是我们遇到的最多的异常了,前后端联调:嗨!哥们,你这500啥意思呀?,后端:先是沉思,这怎么会有空指针?对前端说:哥们等1分钟,马上解决,我可不能说空指针,我可是老开发了!说空指针多没面子。,产生过这种无奈的请在评论区大声说出来!无论是新手还是专家,在NullPointerException面前可谓众生平等,我们编程时经常承受:写了类型检查,值判断,最终没想到竟然是一个null的痛苦,毫不留情的甩出来一个令人厌烦的NullPointerException,比如:,系统中用户,有些用户进行了实名认证,拥有身份证信息,有些用户并没有完成实名认证就没有身份证信息【不要深究设计是否合理,仅仅是举例讲解Optional知识点】,用户类:,身份证类:,测试类:获取用户的身份证号码,运行结果:,正确使用Java8中的Optional,它远比我们想象的优秀,如果user是传递进来的,传进来的user也有可能是null,怎样做才能避免不期而至的NullPointerException?通常,在需要的地方添加null的检查,所以我们的代码多了很多的判断是否为null的验证,影响代码结构,甚至有时不加思索是否需要验证也会统一加上非空判断,来避免不可预知的空值,防止生产环境造成损失!并且添加的方式往往各有不同:,嵌套判断:,逐个判断:,运行结果:,正确使用Java8中的Optional,它远比我们想象的优秀,如果有其他要求,就要做更多的非空判断,影响代码的连贯性,净判断空值了,一旦忘记判断某一个值是否为空,就又要和 NullPointerException 偶遇了,它并不是女朋友,而是最不想遇见的【债主】,Java团队结合Haskell和Scala语言对null值的处理方式,在JDK8时推出Optional类来专门处理空值问题,当然该类并不是为了避免我们去写!=null的非空判断,他功能很强,配合Lambda表达式更香,正确使用Java8中的Optional,它远比我们想象的优秀,从Optional类的定义和声明来看特点如下:,通过案例感受Optional处理null的套路:,User类:,IdCard类:,测试类:,运行结果:,我们仅仅传入了user对象,IdCard为null,通过getUserIdcardNum方法处理之后,返回定义的无实名认证,这里并没有做if…else的判断,这样的代码看起来更优雅,不是吗?,正确使用Java8中的Optional,它远比我们想象的优秀,总结来说:,接下来讲解一下Optional中的API,系统认识,学习强大的Optional,正确使用Java8中的Optional,它远比我们想象的优秀,强烈建议:打开编辑器,多翻阅源码,对学习和编码都有很大帮助,刚开始看不懂没关系,量变产生质变,通过Optional源码发现:,
,正确使用Java8中的Optional,它远比我们想象的优秀,代码实现:,作用:获取optional实例中的对象,当optional 容器为空时报错,源码:,正确使用Java8中的Optional,它远比我们想象的优秀,null值Optional:,正确使用Java8中的Optional,它远比我们想象的优秀,非null值Optional:,正确使用Java8中的Optional,它远比我们想象的优秀,作用:判断optional是否为空,如果空则返回false,否则返回true,源码:,正确使用Java8中的Optional,它远比我们想象的优秀,代码实现:,作用:如果optional不为空,则返回optional中的对象;如果为null,则返回 other 这个默认值,源码:,正确使用Java8中的Optional,它远比我们想象的优秀,代码实现:,作用:如果optional不为空,则返回optional中的对象;如果为null,则使用Supplier函数生成默认值other,源码:,正确使用Java8中的Optional,它远比我们想象的优秀,代码实现:,作用:如果optional不为空,则返回optional中的对象;如果为null,则抛出Supplier函数生成的异常,源码:,正确使用Java8中的Optional,它远比我们想象的优秀,代码实现:,作用:如果optional不为空,则返回optional中的对象;如果为null,则抛出Supplier函数生成的异常,源码:,正确使用Java8中的Optional,它远比我们想象的优秀,代码实现:,作用:如果optional不为空,则执行断言函数p,如果p的结果为true,则返回原本的optional,否则返回空的optional,源码:,正确使用Java8中的Optional,它远比我们想象的优秀,代码实现:,作用:如果optional不为空,则将optional中的对象 t 映射成另外一个对象 u,并将 u 存放到一个新的optional容器中,该方法与Stream的map作用一样,源码:,正确使用Java8中的Optional,它远比我们想象的优秀,代码实现:,作用:在optional不为空的情况下,将对象t映射成另外一个optional,17-flatMapmap接收的是U类型,而flatMap接收的是Optional<U>类型,返回也是需要放进Optional中,源码:,正确使用Java8中的Optional,它远比我们想象的优秀,代码实现:,获取用户名:,通过调用isPresent方法判断是否有值,这还是增加了判断,破坏代码结构,正确姿势:,多用map,orElse,filter方法发挥Optional的作用,文章出自:​​石添的编程哲学​​,如有转载本文请联系【石添的编程哲学】今日头条号。

© 版权声明

相关文章