我们经常会遇到这种情况:首先判断一个对象是否为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. Can't use Subversion command line client***Probably the path to Subversion executable is wrong. Fix

    新同事要入职,赶紧收拾一下电脑:再使用SVNupdate代码时,显示Nothing to show.androidstudio不能使用svn了: 是这样婶滴,报错信息 什么情况: 好了:问题叙述完毕开 ...

  2. C# 如何提取字符串中的数字(小技巧)

    下面讲解如何在字符串当中抓取到数字 方法一.使用正则表达式 1.纯数字提取 1 string str = "提取123abc提取"; //我们抓取当前字符当中的123 2 stri ...

  3. sqlserver表数据的修改

    清除表数据  truncate table  [表名称] 将表b中的一列数据,更新到表tableA  如: tableA .key tableA .value 123   124   tableB.k ...

  4. is 和 == 区别,id() ,回顾编码,encode(),decode()

    1. is 和 == 区别 id()函数 == 判断两边的值 is 判断内存地址例 s = "alex 是 大 xx"# abc = id(s) # 得到内存地址# print(a ...

  5. Java中对List集合的常用操作(转)

    list中添加,获取,删除元素: list中是否包含某个元素: list中根据索引将元素数值改变(替换): list中查看(判断)元素的索引: 根据元素索引位置进行的判断: 利用list中索引位置重新 ...

  6. vue搭配axios踩坑

    客户端项目中有一个小需求“我的卡券”,有单独入口,所以综合考虑之后,采用了vue来实现,因为是初次使用,导致了选型不当,先用了SUI-Mobile来搭建页面,当决定使用vue的时候,页面也搭建完毕了, ...

  7. 从入门到熟悉 HTTPS 的 9 个问题

    九个问题从入门到熟悉HTTPS 最近一边做毕设一边学习编程.前两天她问我 HTTPS 的问题,本来想直接扔一篇网上的教程给她.后来想了一下,那些文章大多直接介绍概念, 对新手不太友好,于是我干脆亲自给 ...

  8. Python模块学习 - jinja2

    模板 要了解jinja2,那么需要先理解模板的概念.模板在Python的web开发中广泛使用,它能够有效的将业务逻辑和页面逻辑分开,使代码可读性增强.并且更加容易理解和维护. 模板简单来说就是一个其中 ...

  9. xshell 设置右键粘贴

    1.打开Xshell,单击菜单栏的Tools(工具),选中Options(菜单),进入参数设置界面.. 2. 选择Keyboard and Mouse (键盘和鼠标),把Right-bottox(向右 ...

  10. SD-WAN供应商列表

    SD-WAN的一个重要思想是,可以使用任何类型的多个物理WAN链路来承载流量,而无需网络工程师进行大量工程设计.相反,SD-WAN解决方案在物理基础设施之上运行覆盖(隧道),抽象出实际链接. SD-W ...