我们经常会遇到这种情况:首先判断一个对象是否为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的简单操作的更多相关文章

  1. Java8中的流操作-基本使用&性能测试

    为获得更好的阅读体验,请访问原文:传送门 一.流(Stream)简介 流是 Java8 中 API 的新成员,它允许你以声明式的方式处理数据集合(通过查询语句来表达,而不是临时编写一个实现).这有点儿 ...

  2. Java8 Optional && Guava Optional

    Java8 -- Optional boolean isPresent():与obj != null()一样:调用get()前要调用isPresent()检查,不然会报错 Optional的三种构造方 ...

  3. java代码之美(16) ---Java8 Optional

    Java8 Optional 一句话介绍Optional类:使用JDK8的Optional类来防止NullPointerException(空指针异常)问题. 一.前言 在我们开放过程中,碰到的异常中 ...

  4. x01.MagicCube: 简单操作

    看最强大脑,发现魔方还是比较好玩的,便买了一个,对照七步还原法,居然也能成功还原. 为什么不写一个魔方程序呢?在网上找了找,略作修改,进行简单操作,还是不错的,其操作代码如下: protected o ...

  5. js简单操作Cookie

    贴一段js简单操作Cookie的代码: //获取指定名称的cookie的值 function getCookie(objName) { var arrStr = document.cookie.spl ...

  6. GitHub学习心得之 简单操作

    作者:枫雪庭 出处:http://www.cnblogs.com/FengXueTing-px/ 欢迎转载 前言 本文对Github的基本操作进行了总结, 主要基于以下文章: http://gitre ...

  7. Linq对XML的简单操作

    前两章介绍了关于Linq创建.解析SOAP格式的XML,在实际运用中,可能会对xml进行一些其它的操作,比如基础的增删该查,而操作对象首先需要获取对象,针对于DOM操作来说,Linq确实方便了不少,如 ...

  8. Linux 中 Vi 编辑器的简单操作

    Linux 中 Vi 编辑器的简单操作 Vi 编辑器一共有3种模式:命名模式(默认),尾行模式,编辑模式.3种模式彼此需要切换. 一.进入 Vi 编辑器的的命令 vi  filename //打开或新 ...

  9. python(pymysql)之mysql简单操作

    一.mysql简单介绍 说到数据库,我们大多想到的是关系型数据库,比如mysql.oracle.sqlserver等等,这些数据库软件在windows上安装都非常的方便,在Linux上如果要安装数据库 ...

随机推荐

  1. Android 支付密码输入框,自定义EditText实现密码输入框功能;

    刚撸出来的密码输入框,注释和逻辑看着挺清晰的,一些属性还没有添加,下个博客把属性添加上去: 看一下图: 直接看代码吧! import android.content.Context; import a ...

  2. windows下git的使用

    1.安装git 下载地址:https://git-scm.com/download/win

  3. kafka 消息系统

    一.为什么需要消息系统 1.解耦: 允许你独立的扩展或修改两边的处理过程,只要确保它们遵守同样的接口约束. 2.冗余: 消息队列把数据进行持久化直到它们已经被完全处理,通过这一方式规避了数据丢失风险. ...

  4. JAVA List合并集合

    import java.util.ArrayList; import java.util.List; public class test { public static void main(Strin ...

  5. 【Jmeter自学】Jmeter实战-web程序(六)

    1.确认测试被测对象 **网站 windows环境 2.需求: 并发登录性能测试 3.场景设置: 1s增加2个线程,运行2000次 分别查看20,,60并发下的表现 4.监控 成功率 响应时间 标准差 ...

  6. js语法规则 ---console.log ---- prompt ----基本类型 ---parseInt

    在页面中可以在body里面加入type=”text/javascript” 例如: <script type="text/javascript"> </scrip ...

  7. 阿里云实现putty私钥登录全过程

    阿里云实现putty私钥登录全过程 1 putty生成公钥和私钥 1)putty生成公钥和私钥 记得在空白区域 滑动 2 公钥上传到阿里云 1)公钥上传  私钥存到本地 3 公钥绑定要登录的实例 4 ...

  8. 《算法》第四章部分程序 part 18

    ▶ 书中第四章部分程序,包括在加上自己补充的代码,在有权有向图中寻找环,Bellman - Ford 算法求最短路径,套汇算法 ● 在有权有向图中寻找环 package package01; impo ...

  9. python学习笔记_week24

    note 内容回顾: Model - 数据库操作 on_delete Query_set select_related 跨表数据一次性拿过来,不增加sql查询次数.帮助跨表,后面参数只能加连表字段 f ...

  10. zip和zipPartitions

    zip函数用于将两个RDD组合成Key/Value形式的RDD,这里默认两个RDD的partition数量以及元素数量都相同,否则会抛出异常. scala> val aa=sc.makeRDD( ...