Java8 Optional的简单操作
我们经常会遇到这种情况:首先判断一个对象是否为null,如果不为null,获取一个对象中的一个属性,如果该属性不为null,又获取该属性的属性,如果该属性的属性不为null,又获取属性的属性的属性;
使用Java8中类Optional优雅解决
例子
一个pojo类;
该类有两个属性,有个属性Project是对象,Project也有属性是DiscoverCenter也是对象,DiscoverCenter中有String属性discoverName;
build方法初始化一个Org对象,并给其属性赋值。
import lombok.Data; @Data
public class Org {
private String name;
private Project project; @Data
public static class Project {
private DiscoverCenter discoverCenter;
} @Data
public static class DiscoverCenter {
private String discoverName;
} public static Org build(String name,String discoverName){
DiscoverCenter discoverCenter = new DiscoverCenter();
discoverCenter.setDiscoverName(discoverName); Project project = new Project();
project.setDiscoverCenter(discoverCenter); Org org = new Org();
org.setProject(project);
org.setName(name); return org;
} private Org(){}
}
现在我们要做的事情是获得嵌套对象最内层的属性String discoverName;
先初始化:
public class TestJava8Optional {
private Org org;
@Before
public void init(){
org = Org.build("Alibaba", "Nacos");
}
用最常规的if-else方式,逐层判断其属性,不为null,才继续获取属性:
@Test
public void ifElse(){
if (null != org){
Org.Project project = org.getProject();
if(null != project){
Org.DiscoverCenter discoverCenter = project.getDiscoverCenter();
if(null != discoverCenter){
String discoverName = discoverCenter.getDiscoverName();
System.out.println(discoverName);
return;
}
}
} throw new IllegalArgumentException("Invalid Object."); }

用Java8 Optional类来处理,先判断org不为null,然后在判断它的属性project,继续逐层判断……:
@Test
public void testNestedObject(){ String s = Optional.ofNullable(org)
.map(o -> o.getProject())
.map(p -> p.getDiscoverCenter())
.map(d -> d.getDiscoverName())
.orElseThrow(() -> new IllegalArgumentException("Invalid Object."));
System.out.println(s);
}

是不是比上面的if-else看起来更加简洁和清晰;
Optional.ofNullable方法是可以接受null值的,Optional的map()函数返回的Optional的泛型是map函数中lambda表达式返回的对象类型,orElseThrow()函数表示如果其中上面一个map函数中的lambda表达式,就抛出的异常。
下面对一个嵌套的Map对象获取最内层的value:
/**
* 获取嵌套最内部的value
*/
@Test
public void testNestedMap(){
Map<String,Object> map = new HashMap<>();
Map<String,Object> project = new HashMap<>();
project.put("Nacos","discover"); Map<String,Object> alibaba = new HashMap<>();
alibaba.put("project",project); Map<String,Object> org = new HashMap<>();
org.put("alibaba",alibaba); map.put("org",org);
Object o1 = Optional.ofNullable(map)
.map(m -> m.get("org"))
.map(o -> ((Map) o).get("alibaba"))
.map(a -> ((Map) a).get("project"))
.map(p -> ((Map) p).get("Nacos"))
.orElse("default value"); System.out.println(o1);
}

Java8 Optional的简单操作的更多相关文章
- Java8中的流操作-基本使用&性能测试
为获得更好的阅读体验,请访问原文:传送门 一.流(Stream)简介 流是 Java8 中 API 的新成员,它允许你以声明式的方式处理数据集合(通过查询语句来表达,而不是临时编写一个实现).这有点儿 ...
- Java8 Optional && Guava Optional
Java8 -- Optional boolean isPresent():与obj != null()一样:调用get()前要调用isPresent()检查,不然会报错 Optional的三种构造方 ...
- java代码之美(16) ---Java8 Optional
Java8 Optional 一句话介绍Optional类:使用JDK8的Optional类来防止NullPointerException(空指针异常)问题. 一.前言 在我们开放过程中,碰到的异常中 ...
- x01.MagicCube: 简单操作
看最强大脑,发现魔方还是比较好玩的,便买了一个,对照七步还原法,居然也能成功还原. 为什么不写一个魔方程序呢?在网上找了找,略作修改,进行简单操作,还是不错的,其操作代码如下: protected o ...
- js简单操作Cookie
贴一段js简单操作Cookie的代码: //获取指定名称的cookie的值 function getCookie(objName) { var arrStr = document.cookie.spl ...
- GitHub学习心得之 简单操作
作者:枫雪庭 出处:http://www.cnblogs.com/FengXueTing-px/ 欢迎转载 前言 本文对Github的基本操作进行了总结, 主要基于以下文章: http://gitre ...
- Linq对XML的简单操作
前两章介绍了关于Linq创建.解析SOAP格式的XML,在实际运用中,可能会对xml进行一些其它的操作,比如基础的增删该查,而操作对象首先需要获取对象,针对于DOM操作来说,Linq确实方便了不少,如 ...
- Linux 中 Vi 编辑器的简单操作
Linux 中 Vi 编辑器的简单操作 Vi 编辑器一共有3种模式:命名模式(默认),尾行模式,编辑模式.3种模式彼此需要切换. 一.进入 Vi 编辑器的的命令 vi filename //打开或新 ...
- python(pymysql)之mysql简单操作
一.mysql简单介绍 说到数据库,我们大多想到的是关系型数据库,比如mysql.oracle.sqlserver等等,这些数据库软件在windows上安装都非常的方便,在Linux上如果要安装数据库 ...
随机推荐
- redis中key过期事件
刚到新公司一个月左右,有个新需求,想做定时任务,比如在用户注册时间的3天后推送用户一条消息. 从刚开始脑子里面闪现的数据库轮询,立马否定掉(浪费资源),再到linux系统的定时任务,但是当用户量过大时 ...
- Jquery ajax 参数 详解
Jquery ajax 参数主要如下: url: 要求为String类型的参数,(默认为当前页地址)发送请求的地址. type: 要求为String类型的参数,请求方式(post或get)默认为get ...
- Vue-ui常用组件库整理
Vue-ui常用组件库整理 查看全部整理内容==> element-ui Element 是由饿了么UED设计.饿了么大前端开发的一套基于 Vue 2.0 的桌面端组件库. 这款是我用了很久的, ...
- spring事务管理实现原理-源码-传播属性
转载请标识 https://me.csdn.net/wanghaitao4j https://blog.csdn.net/wanghaitao4j/article/details/83625260 本 ...
- Vue.js基础(二)
属性 可以将数据进行计算得出新的结果,也可以说是一个公式,有缓存. 应用:1,频繁使用的复杂公式. 2,需要监控的-----全局状态的管理 简写: computed:{ result:functi ...
- spring的IOC 的底层实现原理
IOC:Inversion of Control 控制反转. 指的是 对象的创建权反转(交给)给 Spring. 作用是实现了程序的解耦合.
- Notes on Noise Contrastive Estimation and Negative Sampling
Notes on Noise Contrastive Estimation and Negative Sampling ## 生成负样本 在常见的关系抽取应用中,我们经常需要生成负样本来训练一个好的系 ...
- uva-10720-贪心
题意:对于一个简单图(不存在平行边和自旋边),输入所有的点的度,问,能不能变成一个简单图. 解题思路: 可图化定理.https://blog.csdn.net/shuangde800/article/ ...
- python if all
#encoding:utf-8 s=['1','9']sta='56789'# if all(t not in sta for t in s):# print staif all(t not ...
- Nginx 服务器搭建
什么是Nginx ? Nginx与Apache IIS等软件一样,是一款服务器软件,为web站点提供服务 除此之外,Nginx 还是一款反向代理服务器,我们可以利用Nginx实现负载均衡 所谓负载均衡 ...