Java8 Optional优雅空值判断的示例代码
作者:C疯仔 发布时间:2021-09-20 09:16:26
标签:Java8,Optional,空值
先介绍一下API,与其他文章不同的是,本文采取类比的方式来讲,同时结合源码。而不像其他文章一样,一个个API罗列出来,让人找不到重点。
1、Optional(T value),empty(),of(T value),ofNullable(T value)
这四个函数之间具有相关性,因此放在一组进行记忆。
先说明一下,Optional(T value),即构造函数,它是private权限的,不能由外部调用的。其余三个函数是public权限,供我们所调用。那么,Optional的本质,就是内部储存了一个真实的值,在构造的时候,就直接判断其值是否为空。好吧,这么说还是比较抽象。直接上Optional(T value)构造函数的源码,如下图所示
方式一:
public static void implement(User user) throws Exception {
// 原始 ---> 01
before01(user);
// 优化 ---> 01
upgrade01(user);
}
public static String before01(User user) throws Exception {
// if(user!=null){
// if(user.getAddress()!=null){
// Address address = user.getAddress();
// if(address.getName()!=null){
// return address.getName();
// }
// }
// }
// throw new Exception("取值错误");
if (null != user && null != user.getAddress() && null != user.getAddress().getName()) {
return user.getAddress().getName();
}
throw new Exception("取值错误");
}
public static String upgrade01(User user) throws Exception {
return Optional.ofNullable(user)
.map(user1 -> user1.getAddress())
.map(user2 -> user2.getName())
.orElseThrow(() -> new Exception("取值错误"));
}
方式二:
public static void before02(User user){
if (null != user){
test();
}
}
public static void upgrade02(User user){
Optional.ofNullable(user).ifPresent(user1 -> test());
}
方式三:
public static User before03(User user) throws Exception{
if(user!=null){
String name = user.getName();
if("King".equals(name)){
return user;
}
}else{
user = new User();
user.setName("King");
return user;
}
throw new Exception("取值错误");
}
public static void upgrade03(User user){
Optional.ofNullable(user)
.filter(user1 -> "King".equals(user.getName()))
.orElseGet(() -> {
User user2 = new User();
user2.setName("King");
return user2;
});
}
来源:https://www.cnblogs.com/c-fengzi/archive/2021/05/06/14733538.html


猜你喜欢
- WCF实例(带步骤) <xmlnamespace prefix ="o" ns ="urn:schema
- 这篇文章主要介绍了Java编码摘要算法实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参
- 一般,我们的web应用都是只有在用户登录之后才允许操作的,也就是说我们不允许非登录认证的用户直接访问某些页面或功能菜单项。我还记得很久以前我
- Condition就是实现了管程里面的条件变量。Java 语言内置的管程里只有一个条件变量,而Lock&Condition实现的管程
- 具体代码如下所示:/// <summary> /// 启用事务提交多条带参数的SQL语句 /// </summary>
- 一、简介随着 Apple 发布 iPhone X 之后,各大手机厂商也开始模仿这种刘海屏的设计,而且刘海屏手机的用户也是越来越大,前段时间将
- 出处:https://www.cnblogs.com/SunSpring作为初学者配置maven一般网上搜索。然后你就看到各种配置文件片段,
- 您可以通过为LINQ库不提供的操作添加新运算符,或者通过创建自己的标准查询运算符实现来提高可读性和性能,从而扩展Rx。 编写自定义版本的标准
- 1 redis主从复制的概念多机环境下,一个redis服务接收写命令,当自身数据与状态发生变化,将其复制到一个或多个redis。这种模式称为
- 终端实现大文件上传一直都是比较难的技术,其中涉及到后端与前端的交互,稳定性和流量大小,而且实现原理每个人都有自己的想法,后端主流用的比较多的
- 本文实例讲述了C#中DataSet转化为实体集合类的方法,分享给大家供大家参考。具体实现方法如下:/// <summary>//
- 1.添加依赖直接添加 hibernate-validator<dependency> &n
- 做Android应用,不可避免的会与SQLite打交道。随着应用的不断升级,原有的数据库结构可能已经不再适应新的功能,这时候,就需要对SQL
- 几个月前写过一篇博客《xUtils3.0框架学习笔记》 ,上面也有记录通过xUtils实现文件上传的使用方法,代码如下:private vo
- 最近发现Java原生的Zip压缩组件在压缩过程中,不支持文件名的中文编码,会在压缩过程中把中文文件名变成乱码。Apache的ant包中的压缩
- object对象中的 public boolean equals(Object obj),对于任何非空引用值 x 和 y,当且仅当 x 和
- 1 pom.xml文件注:热部署功能spring-boot-1.3开始有的<!--添加依赖--><dependency&g
- 目录设置应用的名称,包名、应用图标和启动替换应用图标替换启动页设置访问权限配置版本发布参数生成应用签名修改配置文件打包注意事项设置应用的名称
- 概述AOP(Aspect Orient Programming),我们一般称为面向方面(切面)编程,作为面向对象的一种补充,用于处理系统中分
- 整理文档,搜刮出一个Android通过HTTP协议实现断点续传下载的代码,稍微整理精简一下做下分享。FileDownloader.java&