Java妙手判空之Optional
我们有个对象需要对里面的errmsg和PhoneInfo里面的属性的字段进行判空
GetUserPhoneNumberResDto:
@Data
public class GetUserPhoneNumberResDto implements Serializable {private static final long serialVersionUID = -1465870418687241991L;/*用户手机号信息*/private PhoneInfo phone_info;/** 错误码*/private Integer errcode;/** 错误信息*/private String errmsg;public Optional<PhoneInfo> getPhoneInfoOfNull(){return Optional.ofNullable(this.phone_info);}
}
PhoneInfo:
@Data
public class PhoneInfo implements Serializable {private static final long serialVersionUID = 6699668200460532864L;/** 用户绑定的手机号(国外手机号会有区号)*/private String phoneNumber;/** 没有区号的手机号*/private String purePhoneNumber;/** 区号*/private String countryCode;}
直接上代码:
// 对该对象的字段判空String msg;if(!ObjectUtils.isEmpty(getUserPhoneNumberResDto) && StringUtils.isNotEmpty(getUserPhoneNumberResDto.getErrmsg())){msg = getUserPhoneNumberResDto.getErrmsg();} else {msg = null;}String msg = Optional.ofNullable(getUserPhoneNumberResDto).map(GetUserPhoneNumberResDto::getErrmsg).orElse(null);// 对该对象属性的对象中的字段判空String phone;if (!ObjectUtils.isEmpty(getUserPhoneNumberResDto) &&!ObjectUtils.isEmpty(getUserPhoneNumberResDto.getPhone_info()) &&StringUtils.isNotEmpty(getUserPhoneNumberResDto.getPhone_info().getPurePhoneNumber())){phone = getUserPhoneNumberResDto.getPhone_info().getPurePhoneNumber();} else {phone = null;}String phone = Optional.ofNullable(getUserPhoneNumberResDto).flatMap(GetUserPhoneNumberResDto::getPhoneInfoOfNull).map(PhoneInfo::getPurePhoneNumber).orElse(null);
我们注意到利用Optional里面主要运用到flatMap、ofNullable、map、orElse这四个方法,点进去看源码
首先先看看Optional是个什么东西
一个容器对象,可能包含也可能不包含非空值。如果存在值, isPresent()将返回true ,而get()将返回该值。
提供了依赖于包含值是否存在的其他方法,例如orElse() (如果值不存在则返回默认值)和ifPresent() (如果值存在则执行代码块)。
这是一个基于值的类;在Optional的实例上使用身份敏感操作(包括引用相等 ( == )、身份哈希码或同步)可能会产生不可预知的结果,应该避免。
ofNullable:
/**返回一个描述指定值的Optional ,如果非 null ,否则返回一个空Optional 。参数:value -- 要描述的可能为 null 的值回报:如果指定值为非空,则为具有当前值的Optional ,否则为空Optional*/public static <T> Optional<T> ofNullable(T value) {return value == null ? empty() : of(value);}
map:
/**如果存在值,则对其应用提供的映射函数,如果结果为非 null,则返回描述结果的Optional 。否则返回一个空的Optional 。参数:mapper – 应用于值的映射函数(如果存在)回报:Optional描述将映射函数应用于此Optional的值的结果,如果存在值,否则为空Optional抛出:NullPointerException – 如果映射函数为 nullAPI 注释:此方法支持对可选值进行后处理,无需显式检查返回状态。例如,以下代码遍历文件名流,选择一个尚未处理的文件,然后打开该文件,返回一个Optional :Optional<FileInputStream> fis = names.stream().filter(name -> !isProcessedYet(name)) .findFirst() .map(name -> new FileInputStream(name));在这里, findFirst返回一个Optional , 然后map返回一个Optional 如果存在所需的文件。*/public<U> Optional<U> map(Function<? super T, ? extends U> mapper) {Objects.requireNonNull(mapper);if (!isPresent())return empty();else {return Optional.ofNullable(mapper.apply(value));}}
flatMap:
/**如果存在值,则将提供的Optional轴承映射函数应用于它,返回该结果,否则返回空Optional 。此方法类似于map(Function) ,但提供的映射器的结果已经是Optional ,如果被调用, flatMap不会用附加的Optional包装它。参数:mapper – 应用于值的映射函数,如果存在映射函数回报:如果存在值,则将Optional轴承映射函数应用于此Optional的值的结果,否则为空Optional抛出:NullPointerException – 如果映射函数为 null 或返回 null 结果*/public<U> Optional<U> flatMap(Function<? super T, Optional<U>> mapper) {Objects.requireNonNull(mapper);if (!isPresent())return empty();else {return Objects.requireNonNull(mapper.apply(value));}}
orElse:
/**如果存在则返回值,否则返回other 。参数:other – 如果不存在值,则返回的值,可以为 null回报:该值(如果存在),否则为other*/public T orElse(T other) {return value != null ? value : other;}
Java妙手判空之Optional相关推荐
- 【Java 8系列】Java开发者的判空利器 -- Optional
热门系列: [Java 8系列]收集器Collector与工具类Collectors [Java 8系列]Stream详解,看这一篇就够啦 [Java 8系列]Lambda 表达式,一看就废 [Jav ...
- Java集合判空/非空
1. 乱象 代码中各种同胞写的各种集合判空,很多,很杂乱.大多数是不规范的,而且可能会造成NPE,特别是业务层调DAO层查询列表时,势必会有空值返回,这个时候一个简单的 list.size()> ...
- Java 优雅判空的方法
为了避免 NullPointerException 出现,我们经常会进行如下操作. if (object != null) {object.do(); } 那么每次使用一个不确定的对象,都需要进行一次 ...
- JAVA字符串判空的方法
1.记录自己工作中的问题:针对某些字符串进行判空时,出现的BUG StringUtils.hasText StringUtils.hasText(null) = falseStringUtils.ha ...
- java 字符串判空_java判断字符串String是否为空问题浅析
/** * Created with IntelliJ IDEA. * User: Administrator * Date: 14-1-16 * Time: 上午10:43 * 判断字符串是否为空的 ...
- JDK8:使用Optional进行变量判空、集合遍历
防止 NPE,是程序员的基本修养. NPE(Null Pointer Exception)一直是我们最头疼的问题,也是最容易忽视的地方.NPE常是导致Java应用程序失败的最常见的原因.在日常研发工作 ...
- 在 Java 中如何优雅地判空
点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 作者 | 李良逸 来源 | blog.imuxuan.c ...
- 如何判断map为空_在Java中如何优雅地判空
来自:李良逸 链接:http://blog.imuxuan.com/archives/86 判空灾难 作为搬砖党的一族们,我们对判空一定再熟悉不过了,不要跟我说你很少进行判空,除非你喜欢 NullPo ...
- 求求你不要在用!=null判空了
作者:诗意凌风 | http://suo.im/5t3akh 导语 在没有用Optional判空之前,你是否也像下面的代码一样判空呢?如果是,请往下看,Optional 相对传统判空的优势. java ...
最新文章
- AC日记——欧几里得的游戏 洛谷 P1290
- python中shutil模块_python文件、文件夹、压缩包处理模块-shutil模块-阿里云开发者社区...
- Java--FutureTask原理与使用(FutureTask可以被Thread执行,可以被线程池submit方法执行,并且可以监控线程与获取返回值)...
- tar time stamp in the future问题
- Spark入门(十三)之分组求平均值
- pycharm 自动补全括号 引号
- 看懂Oracle执行计划(转载)
- 力扣报错“AddressSanitizer: heap-buffer-overflow on address...”的解决办法
- C语言目录文件操作补充
- 有关python_30个有关Python的小技巧
- 学生成绩查询c#语言,C#学生成绩查询系统.doc
- 常用排序算法之插入排序 ( 直接插入排序、希尔排序 )
- pycharm调节字体大小
- window下c语言c s通信,c++ Windows Socket实现最简单的C/S网络通信(TCP)
- SUFFER软件测试工程师,Ubuntu9.0.4下FreeSurfer的安装(转)
- Linux中常用命令(初学者必备)
- Java函数式编程-三更草堂-学习笔记
- 一文讲透什么是机器视觉!
- python慢画炫彩圆圈_pygame绘画与动画
- 第10课:《ChatGPT提示工程》—— Guidelines(入门)
热门文章
- Linux目录结构及其用途
- 气管炎,支气管炎,急性支气管炎
- 怎样把服务器的文件改名字,linux服务器如何修改文件名称rm命令删除文件时排除特定文件...
- labelme-mask
- 1.数据链路层(MAC层)
- 在Chrome中告别Flash
- 多维泰勒网(Multi-dimensional Taylor Network,MTN)
- 使用vscode搭建python开发环境
- GitHub:哔哩哔哩的API调用模块
- 【Android 安全】深思数盾 Virbox 加固应用 ( 购买加固服务 | 下载加固软件 | 启动加固软件 | 函数 VMP 壳设置 | 加密选项 | 资源加密 | SO 保护 )