我们有个对象需要对里面的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相关推荐

  1. 【Java 8系列】Java开发者的判空利器 -- Optional

    热门系列: [Java 8系列]收集器Collector与工具类Collectors [Java 8系列]Stream详解,看这一篇就够啦 [Java 8系列]Lambda 表达式,一看就废 [Jav ...

  2. Java集合判空/非空

    1. 乱象 代码中各种同胞写的各种集合判空,很多,很杂乱.大多数是不规范的,而且可能会造成NPE,特别是业务层调DAO层查询列表时,势必会有空值返回,这个时候一个简单的 list.size()> ...

  3. Java 优雅判空的方法

    为了避免 NullPointerException 出现,我们经常会进行如下操作. if (object != null) {object.do(); } 那么每次使用一个不确定的对象,都需要进行一次 ...

  4. JAVA字符串判空的方法

    1.记录自己工作中的问题:针对某些字符串进行判空时,出现的BUG StringUtils.hasText StringUtils.hasText(null) = falseStringUtils.ha ...

  5. java 字符串判空_java判断字符串String是否为空问题浅析

    /** * Created with IntelliJ IDEA. * User: Administrator * Date: 14-1-16 * Time: 上午10:43 * 判断字符串是否为空的 ...

  6. JDK8:使用Optional进行变量判空、集合遍历

    防止 NPE,是程序员的基本修养. NPE(Null Pointer Exception)一直是我们最头疼的问题,也是最容易忽视的地方.NPE常是导致Java应用程序失败的最常见的原因.在日常研发工作 ...

  7. 在 Java 中如何优雅地判空

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 作者 | 李良逸 来源 | blog.imuxuan.c ...

  8. 如何判断map为空_在Java中如何优雅地判空

    来自:李良逸 链接:http://blog.imuxuan.com/archives/86 判空灾难 作为搬砖党的一族们,我们对判空一定再熟悉不过了,不要跟我说你很少进行判空,除非你喜欢 NullPo ...

  9. 求求你不要在用!=null判空了

    作者:诗意凌风 | http://suo.im/5t3akh 导语 在没有用Optional判空之前,你是否也像下面的代码一样判空呢?如果是,请往下看,Optional 相对传统判空的优势. java ...

最新文章

  1. AC日记——欧几里得的游戏 洛谷 P1290
  2. python中shutil模块_python文件、文件夹、压缩包处理模块-shutil模块-阿里云开发者社区...
  3. Java--FutureTask原理与使用(FutureTask可以被Thread执行,可以被线程池submit方法执行,并且可以监控线程与获取返回值)...
  4. tar time stamp in the future问题
  5. Spark入门(十三)之分组求平均值
  6. pycharm 自动补全括号 引号
  7. 看懂Oracle执行计划(转载)
  8. 力扣报错“AddressSanitizer: heap-buffer-overflow on address...”的解决办法
  9. C语言目录文件操作补充
  10. 有关python_30个有关Python的小技巧
  11. 学生成绩查询c#语言,C#学生成绩查询系统.doc
  12. 常用排序算法之插入排序 ( 直接插入排序、希尔排序 )
  13. pycharm调节字体大小
  14. window下c语言c s通信,c++ Windows Socket实现最简单的C/S网络通信(TCP)
  15. SUFFER软件测试工程师,Ubuntu9.0.4下FreeSurfer的安装(转)
  16. Linux中常用命令(初学者必备)
  17. Java函数式编程-三更草堂-学习笔记
  18. 一文讲透什么是机器视觉!
  19. python慢画炫彩圆圈_pygame绘画与动画
  20. 第10课:《ChatGPT提示工程》—— Guidelines(入门)

热门文章

  1. Linux目录结构及其用途
  2. 气管炎,支气管炎,急性支气管炎
  3. 怎样把服务器的文件改名字,linux服务器如何修改文件名称rm命令删除文件时排除特定文件...
  4. labelme-mask
  5. 1.数据链路层(MAC层)
  6. 在Chrome中告别Flash
  7. 多维泰勒网(Multi-dimensional Taylor Network,MTN)
  8. 使用vscode搭建python开发环境
  9. GitHub:哔哩哔哩的API调用模块
  10. 【Android 安全】深思数盾 Virbox 加固应用 ( 购买加固服务 | 下载加固软件 | 启动加固软件 | 函数 VMP 壳设置 | 加密选项 | 资源加密 | SO 保护 )