文章目录
前言
今天遇到一个问题,在调用第三方接口时返回的数据我用封装好的对象接收的。返回的数据字段为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