Java8 Optioanl解决空指针异常

文章目录


前言

今天遇到一个问题,在调用第三方接口时返回的数据我用封装好的对象接收的。返回的数据字段为code,msg,data。我使用对象直接接收的data里面的数据。在数据判断时出现了问题。


一、返回数据展示?

返回情况有两种,一种是data有数据,一种是没有数据

1.data无数据

{“code”:“1003”,“msg”:“不存在该客户机操作系统”,“data”:{}}

2.data有数据但为empty

{“code”:“0”,“msg”:“操作成功”,“data”:{“fileList”:[],“count”:“0”}}

二、报错场景复现

	//这儿我直接调用第三方接口,并且返回值data 使用subplatform 接收
	SubPlatformFileResp subPlatform = client.getFilesSubPlatform(subPlatFormFileReq);
	if(subPlatform.getData()!=null){  //data数据的非空判断
		if(!subPlatform.getData().getFileList().isEmpty()){
		//业务逻辑
		}
	}

从返回值可以看出,data为 {} ,但是data并不为null,所以在后续获取getFileList()时因为没有该对象会报空指针异常,当然可以通过对filelist进行null判断也可以解决这个问题

	if (subPlatform.getData().getFileList()!=null){
	}

二.Optional 优雅解决

1.java8提供 optional这个类来进行判断处理,以及判空后的业务逻辑处理

修改后的代码

 if(Optional.ofNullable(subPlatform.getData().getFileList()).isPresent()){
 }

2.optional类

of

为非null的值创建一个Optional。of方法通过工厂方法创建Optional类。需要注意的是,创建对象时传入的参数不能为null。如果传入参数为null,则抛出NullPointerException

Optional<String> optional = Optional.of("xiaoming");
//传入null,抛出NullPointerException
Optional<Object> o = Optional.of(null);

ofNULLable

为指定的值创建一个Optional,如果指定的值为null,则返回一个空的Optional

Optional<Object> o1 = Optional.ofNullable(null);

isPresent

值存在返回true,否则返回false

Optional<String> optiona2 = Optional.of("xiaoming");
System.out.println(optiona2.isPresent());

get

Optional有值就返回,没有抛出NoSuchElementException

Optional<Object> o1 = Optional.ofNullable(null);
System.out.println(o1.get());

ifPresent

Optional<Object> o1 = Optional.ofNullable(null);
 o1.ifPresent(s -> System.out.println(s));

orElse

如果有值则将其返回,否则返回指定的其它值

Optional<Object> o1 = Optional.ofNullable(null);
System.out.println(o1.orElse("输出orElse")); // 输出orElse

orElseGet

orElseGet与orElse方法类似,区别在于得到的默认值。orElse方法将传入的字符串作为默认值,orElseGet方法可以接受Supplier接口的实现用来生成默认值

Optional<Object> o1 = Optional.ofNullable(null);
System.out.println(o1.orElseGet(() -> "default value")); // default value

orElseThrow

如果有值则将其返回,否则抛出supplier接口创建的异常。

Optional<Object> o1 = Optional.ofNullable(null);
try {
  o1.orElseThrow(() -> new Exception("异常!"));
} catch (Exception e) {
  System.out.println("info:" + e.getMessage());
}//输出:info:异常!

map

如果有值,则对其执行调用mapping函数得到返回值。如果返回值不为null,则创建包含mapping返回值的Optional作为map方法返回值,否则返回空Optional。

Optional<String> optional = Optional.of("xiaoming");
String s = optional.map(e -> e.toUpperCase()).orElse("shiyilingfeng");
System.out.println(s); //输出: XIAOMING

flatMap

如果有值,为其执行mapping函数返回Optional类型返回值,否则返回空Optional。与map不同的是,flatMap 的返回值必须是Optional,而map的返回值可以是任意的类型T

Optional<String> optional = Optional.of("xiaoming");
Optional<String> s = optional.flatMap(e -> Optional.of(e.toUpperCase()));
System.out.println(s.get()); //输出:XIAOMING

filter

List<String> strings = Arrays.asList("rmb", "doller", "ou");
for (String s : strings) {
  Optional<String> o = Optional.of(s).filter(s1 -> !s1.contains("o"));
  System.out.println(o.orElse("没有不包含o的"));
}//输出:
rmb
没有不包含o的
没有不包含o的

总结

Optional 是java非常有用的一个补充,它旨在减少代码中的NullPointerExceptions,虽然不能百分之百的消除,但也是精心设计的。使用Optional 能更好的帮助我们创建可读性强,bug更少的应用程序。

参考

https://www.toutiao.com/i6872294360059216388?wid=1638863738494

上一篇:Day29.线程安全、线程同步synchronized() 、死锁


下一篇:AcWing 1996. 打乱字母