我们经常会遇到这种情况:首先判断一个对象是否为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);
}

最新文章

  1. HDU 4801 Pocket Cube
  2. delphi 判断一个数组的长度用 Length 还是 SizeOf ?
  3. Ubuntu14.04安装pip及配置
  4. jquery getJSON
  5. linux kernel 0.11 bootsect
  6. C#判断字符串为空
  7. Python基础:1.数据类型(元组)
  8. docker registry 搭建
  9. base64加密解密文件
  10. Tomcat地址栏传中文参数乱码问题处理
  11. python学习随笔(二)
  12. 两个java项目,跨域访问时,浏览器不能正确解析数据问题
  13. 【设计模式】桥接模式 Bridge Pattern
  14. RabbitMQRPC 官方demo
  15. 关于ckeditor5设置高度
  16. intel xeon家族介绍
  17. jQuery生成QRcode二维码
  18. Mybatis -- 批量添加 -- insertBatch
  19. JDBC 与 Bean Shell的使用(一)获取值,并且传递
  20. Java 代理模式(二) Java中的动态代理

热门文章

  1. 查看linux的IO占用
  2. oracle补齐日期
  3. eclipse聚合工程如何提交SVN,如何从SVN下载
  4. 剑指Offer(四):重建二叉树
  5. getdate — 取得日期/时间信息-----参数是一个 integer 的 Unix 时间戳
  6. NDK samples以及部分博客
  7. 看到的一个关于C++能力分级的描述
  8. STM32F103C8开发板原理图和管脚图
  9. Oracle创建表及管理表
  10. 查看进程中的socket状态和数量