Java8 Optioanl解决空指针异常
2021/12/7 17:17:33
本文主要是介绍Java8 Optioanl解决空指针异常,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
文章目录
- 前言
- 一、返回数据展示?
- 返回情况有两种,一种是data有数据,一种是没有数据
- 二、报错场景复现
- 二.Optional 优雅解决
- 1.java8提供 optional这个类来进行判断处理,以及判空后的业务逻辑处理
- 2.optional类
- of
- ofNULLable
- isPresent
- get
- ifPresent
- orElse
- orElseGet
- orElseThrow
- map
- flatMap
- filter
- 总结
- 参考
前言
今天遇到一个问题,在调用第三方接口时返回的数据我用封装好的对象接收的。返回的数据字段为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
这篇关于Java8 Optioanl解决空指针异常的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-05-15鸿蒙生态设备数量超8亿台
- 2024-05-13TiDB + ES:转转业财系统亿级数据存储优化实践
- 2024-05-09“2024鸿蒙零基础快速实战-仿抖音App开发(ArkTS版)”实战课程已上线
- 2024-05-09聊聊如何通过arthas-tunnel-server来远程管理所有需要arthas监控的应用
- 2024-05-09log4j2这么配就对了
- 2024-05-09nginx修改Content-Type
- 2024-05-09Redis多数据源,看这篇就够了
- 2024-05-09Google Chrome驱动程序 124.0.6367.62(正式版本)去哪下载?
- 2024-05-09有没有大佬知道这种数据应该怎么抓取呀?
- 2024-05-09这种运行结果里的10.100000001,怎么能最快改成10.1?