当前位置:首页 > 科技  > 软件

Java空指针检查实在看不下去了——转用Optional真香

来源: 责编: 时间:2023-11-14 09:09:12 390观看
导读前言在Java开发中,空指针是程序员遇到的最多的异常之一(特别是刚接触java开发的),对于对象中的某个属性,有时候我们为了避免程序报空指针错误,而不得不使用较多的if、else来进行逻辑判断,但这样的话代码可能就会比较冗余或者

cAA28资讯网——每日最新资讯28at.com

前言

在Java开发中,空指针是程序员遇到的最多的异常之一(特别是刚接触java开发的),对于对象中的某个属性,有时候我们为了避免程序报空指针错误,而不得不使用较多的if、else来进行逻辑判断,但这样的话代码可能就会比较冗余或者说不够优雅。虽然我们大部分程序员是有责任心的,不会坐视不管,于是就有了大量的 null 值检查。尽管有时候这种检查完全没有必要,但我们已经习惯了例行公事。终于Java 8 看不下去了,就引入了 Optional,以便我们编写的代码不再那么呆板。cAA28资讯网——每日最新资讯28at.com

NPE问题

NPE问题就是我们在开发中经常碰到的NullPointerException.假设我们有两个类,他们的UML类图如下图所示:cAA28资讯网——每日最新资讯28at.com

cAA28资讯网——每日最新资讯28at.com

现在需要访问用户地址信息的省份,简单代码为:user.getAddress().getProvince();cAA28资讯网——每日最新资讯28at.com

在这种写法中,当user为null时,是有可能报NPE异常的。为了解决这个问题,于是采用下面的写法:cAA28资讯网——每日最新资讯28at.com

public String OptGetProvince(User user){      if(user!=null){          Address address = user.getAddress();          if(address!=null){              String province = address.getProvince();              return province;          }          return "none";      }}

这种写法是比较繁琐的,为了避免上述丑陋的写法。于是JAVA8提供了Optional类来优化这种写法:cAA28资讯网——每日最新资讯28at.com

public String OptGetProvince(User user){        return Optional.ofNullable(user)                .map(s -> s.getAddress())                .map(a -> a.getProvince())                .orElse("none");    }

可以看到,通过Optional的使用,可以很好的解决if以及嵌套判空的问题,使得整体的判断变得清爽简洁多了。cAA28资讯网——每日最新资讯28at.com

Optional使用

我们可以把Optional类看成是一个容器,我们将对象存储到容器中后,通过调用内置的API,可以较为安全地过滤掉可能存在的空指针问题,避免繁琐嵌套的if、else操作,让我们的代码尽可能的简洁。API主要分5个大类。cAA28资讯网——每日最新资讯28at.com

cAA28资讯网——每日最新资讯28at.com

构造函数: empty,of,ofNullable

empty返回一个空的Optional对象。cAA28资讯网——每日最新资讯28at.com

Optional.empty();

of根据传入的值生成Optional对象。cAA28资讯网——每日最新资讯28at.com

// 方式2 将非空对象作为属性传入Optional类中User u = new User("小明",16); Optional.of(u.getAddress());

ofNullable 和of方法一样,根据传入的值生成optional对象。cAA28资讯网——每日最新资讯28at.com

// 方式3 将非空对象作为属性传入Optional类中 User u = new User("小明",16); Optional.ofNullable(u.getAddress());

of和ofNullable的作用很相近,从Optional类的源代码看的话,可以发现对于ofNullable方法的话是有进行判空的。也就是说,如果使用of方法传入的参数是null,同样会报空指针。cAA28资讯网——每日最新资讯28at.com

cAA28资讯网——每日最新资讯28at.com

值选择方法:orElse,orElseGet和orElseThrow

这三个方法相当于SQL中的IFNULL函数,若Optional中值为null,则返回给定的默认值。cAA28资讯网——每日最新资讯28at.com

orElse

User s = new User("小明",16,new Address());String result = Optional.ofNullable(s.getAddress().getProvince()).orElse("深圳");

orElseGet

User s = new User("小明",16,new Address());String result = Optional.ofNullable(s.getAddress().getProvince()).orElseGet(()->"深圳");

orElseThrow

User s = new User("小明",16,new Address());String s3 = Optional.ofNullable(s.getAddress().getProvince()).orElseThrow(() -> new IllegalArgumentException("缺少参数"));

对于orElseThrow和orElseGet两个方法,是采用函数式接口的方式来作为参数的。同时,对于orElse和orElseGet两个方法,作用相近,区别是若Optional对象中的值不为空,则orElseGet不会创建参数中的对象,而orElse无论什么情况都会创建参数对象。cAA28资讯网——每日最新资讯28at.com

判空函数:isPresent和ifPresent

两个函数的用法类似,都可以用作判空,区别在于当不为空时,ifPresent会执行对应的函数。cAA28资讯网——每日最新资讯28at.com

isPresent

User user = new User("小明",16,new Address());boolean b1 = Optional.ofNullable(user.getAddress()).isPresent();System.out.println(b1);  // true

ifPresent

User user = new User("小明",16,new Address());Optional.ofNullable(user.getAddress()).ifPresent(address -> System.out.println(address));

值转换函数:map和flagMap

值转换的就是对Optional对象中的value值进行转换,对值应用(调用)作为参数的函数,然后将返回的值包装在 Optional中cAA28资讯网——每日最新资讯28at.com

map

User user = new User("小明",16,new Address());String s1 = Optional.ofNullable(user).map(s -> s.getName()).get();

flagMap

User user = new User("小明",16,new Address());String s1 = Optional.ofNullable(user).flatMap(s -> s.getName()).get();

两个函数都可以实现值的转换,两者的区别是二者的入参不同。以上面的flagMap的示例代码为例,我们需要在User类中重写一下getName方法,使其返回Optional对象。cAA28资讯网——每日最新资讯28at.com

过滤(筛选)函数:filter

该函数的作用是,判断Optional中的值是否满足指定条件,若满足则返回,否则返回一个EMPTY对象。cAA28资讯网——每日最新资讯28at.com

User user = new User("小明",16,new Address());User result = Optional.ofNullable(user).filter(s -> s.getName().equals("小红")).orElseGet(() ->new User("小蓝",10));System.out.println(result); // user{address=null, name='小蓝', age=10}

这里会筛选出满足姓名为小红的User对象,若不满足则新建一个姓名为小蓝的User对象。cAA28资讯网——每日最新资讯28at.com

最后

需要注意,使用Optonal这种链式编程虽然简洁化了程序代码,但是逻辑性不是很明显,相对来说会损失一定的代码可读性,具体的使用需要开发人员在实际场景中进行权衡。个人建议哪怕是自己不经常使用也要尽量掌握,避免出现阅读源码的时候显得尴尬。cAA28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-24298-0.htmlJava空指针检查实在看不下去了——转用Optional真香

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: Scylla数据库-高性能的分布式数据库

下一篇: 掌握Python的高级函数:提升代码的灵活性和可读性

标签:
  • 热门焦点
  • vivo TWS Air开箱体验:真轻 臻好听

    在vivo S15系列新机的发布会上,vivo的最新款真无线蓝牙耳机vivo TWS Air也一同发布,本次就这款耳机新品给大家带来一个简单的分享。外包装盒上,vivo TWS Air保持了vivo自家产
  • 一加首款折叠屏!一加Open渲染图出炉:罕见单手可握小尺寸

    8月5日消息,此前就有爆料称,一加首款折叠屏手机将会在第三季度上市,如今随着时间临近,新机的各种消息也开始浮出水面。据悉,这款新机将会被命名为“On
  • 一文看懂为苹果Vision Pro开发应用程序

    译者 | 布加迪审校 | 重楼苹果的Vision Pro是一款混合现实(MR)头戴设备。Vision Pro结合了虚拟现实(VR)和增强现实(AR)的沉浸感。其高分辨率显示屏、先进的传感器和强大的处理能力
  • 让我们一起聊聊文件的操作

    文件【1】文件是什么?文件是保存数据的地方,是数据源的一种,比如大家经常使用的word文档、txt文件、excel文件、jpg文件...都是文件。文件最主要的作用就是保存数据,它既可以保
  • 得物宠物生意「狂飙」,发力“它经济”

    作者|花花小萌主近日,得物宣布正式上线宠物鉴别,通过得物App内的“在线鉴别”,可找到鉴别宠物的选项。通过上传自家宠物的部位细节,就能收获拥有专业资质认证的得物鉴
  • 年轻人的“职场羞耻感”,无处不在

    作者:冯晓亭 陶 淘 李 欣 张 琳 马舒叶来源:燃次元“人在职场,应该选择什么样的着装?”近日,在网络上,一个与着装相关的帖子引发关注,在该帖子里,一位在高级写字楼亚洲金
  • 重估百度丨大模型,能撑起百度的“今天”吗?

    自象限原创 作者|程心 罗辑2023年之前,对于自己的“今天”,百度也很迷茫。“新业务到 2022 年底还是 0,希望 2023 年出来一个 1。”这是2022年底,李彦宏
  • iQOO Neo8系列或定档5月23日:首发天玑9200+ 安卓跑分王者

    去年10月,iQOO推出了iQOO Neo7系列机型,不仅搭载了天玑9000+,而且是同价位唯一一款天玑9000+直屏旗舰,一经上市便受到了用户的广泛关注。在时隔半年后,
  • 荣耀Magic4 至臻版 首创智慧隐私通话 强劲影音系统

    2022年第一季度临近尾声,在该季度内,许多品牌陆续发布自己的最新产品,让大家从全新的角度来了解当今的手机技术。手机是电子设备中,更新迭代十分迅速的一款产品,基
Top