京东云开发者|深入JDK中的Optional

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了京东云开发者|深入JDK中的Optional相关的知识,希望对你有一定的参考价值。

概述:Optional最早是Google公司Guava中的概念,代表的是可选值。Optional类从Java8版本开始加入豪华套餐,主要为了解决程序中的NPE问题,从而使得更少的显式判空,防止代码污染,另一方面,也使得领域模型中所隐藏的知识,得以显式体现在代码中。Optional类位于java.util包下,对链式编程风格有一定的支持。实际上,Optional更像是一个容器,其中存放的成员变量是一个T类型的value,可值可Null,使用的是Wrapper模式,对value操作进行了包装与设计。本文将从Optional所解决的问题开始,逐层解剖,由浅入深,文中会出现Optioanl方法之间的对比,实践,误用情况分析,优缺点等。与大家一起,对这项Java8中的新特性,进行理解和深入。

1、解决的问题

臭名昭著的空指针异常,是每个程序员都会遇到的一种常见异常,任何访问对象的方法与属性的调用,都可能会出现NullPointException,如果要确保不触发异常,我们通常需要进行对象的判空操作。

举个栗子,有一个人(Shopper)进超市购物,可能会用购物车(Trolley)也可能会用其它方式,购物车里可能会有一袋栗子(Chestnut),也可能没有。三者定义的代码如下:


PlainjavascriptJavahtml/XMLMarkdownMakefileGoJSONSQLObjective-cYAMLBashphpPython
public class Shopper
private Trolley trolley;
public Trolley getTrolley()
return trolley;


public class Trolley
private Chestnut chestnut;
public Chestnut getChestnut()
return chestnut;


public class Chestnut
private String name;
public String getName()
return name;

这时想要获得购物车中栗子的名称,像下面这么写,就可能会见到我们的“老朋友”(NPE)

PlainJavascriptJavaHTML/XMLMarkdownMakefileGoJSONSQLObjective-cYAMLBashPHPPython
public String result(Shopper shopper)
return shopper.getTrolley().getChestnut().getName();

为了能避免出现空指针异常,通常的写法会逐层判空(多层嵌套法),如下

PlainJavascriptJavaHTML/XMLMarkdownMakefileGoJSONSQLObjective-cYAMLBashPHPPython
public String result(Shopper shopper)
if (shopper != null)
Trolley trolley = shopper.getTrolley();
if (trolley != null)
Chestnut chestnut = trolley.getChestnut();
if (chestnut != null)
return chestnut.getName();



return "获取失败辽";

多层嵌套的方法在对象级联关系比较深的时候会看的眼花缭乱的,尤其是那一层一层的括号

以上是关于京东云开发者|深入JDK中的Optional的主要内容,如果未能解决你的问题,请参考以下文章

JDK8中新增的Optional工具类真的很好用哦,建议收藏

JDK8系列之Optional API应该怎样用?

深入理解lambda的奥秘

京东云开发者|京东云RDS数据迁移常见场景攻略

深入理解Stream之原理剖析

京东云开发者|经典同态加密算法Paillier解读 - 原理实现和应用