使用Optional摆脱NPE的折磨

bobbin官网

建筑的建筑设计的体系结构

在我目前的工作中,我在Java中使用了很多Stream和Lambda表达式。我还写了两篇文章来总结相应的知识。

024:Java流实现Shell:cat 1.log | grep a |排序| uniq -c | sort -rn

功能编程让您忘记了设计模式

但是,Optional功能还没有得到很好的使用,所以我最近开始阅读《Java 8实战》这本书。本文是第10章的学习总结。

在Java中,如果您尝试将函数调用为null,则会引发NullPointerException(NPE),这是Java程序开发中最典型的异常。对于Java开发人员来说,无论你是一个新手并且仍然工作多年,老司机,NPE经常让他们翻身。为了避免NPE,他们会添加很多if判断语句,使得代码的可读性非常差。

从软件设计的角度来看,null本身是无意义的语义,它是缺少变量值的错误的模型。

从Java类型系统的角度来看,null可以被分配给任何类型的变量并且不断传递,因为知道没有人知道从哪里引入它。

Java设计人员从Haskell和Scala中汲取灵感,并在Java 8中引入了一个新类。如果一个接口返回Optional,则可能意味着一个人可能有也可能没有汽车。这比简单地归还汽车更明确。阅读代码的人不需要提前准备商业知识。

Optional的目的在于:系统类型在代码中显式隐藏域模型中隐藏的知识。

方法

描述

返回一个空的可选实例

过滤

返回包含该值的Optional对象;否则返回一个空的Optional对象

如果该值存在,则对值

执行提供的映射函数调用

flatMap

如果值存在,则对值执行提供的映射函数调用,返回Optional类型值,否则返回空的Optional对象

ifPresent

如果值存在,则执行使用该值的方法调用,否则不执行任何操作

使用Optional返回指定的值,如果值为null,则返回NPE

ofNullable

使用Optional返回指定的值,如果值为null,则返回空的Optional对象

否则容易

如果有值则返回,否则返回默认值

orElseGet

如果有值则返回,否则返回由指定的Supplier接口生成的值(如果默认值相对昂贵,则适合使用orElseGet方法)

orElseThrow

如果有值则返回,否则返回指定供应商接口抛出的异常

获得

如果值存在,则返回该值,否则抛出NoSuchElementException

isPresent

如果值存在则返回true,否则返回

上表列出了Optional的基本API。以下是一些使用提示:

您可以使用ofNullable将可能为null的对象封装为Optional对象,然后在获取值时使用orElse方法提供默认值;您可以使用empty方法创建一个空的Optional对象;通常不使用of方法,但是如果你知道一个该值不能为null,那么你可以使用Optional包装该值,以便在它为null时抛出异常。

您可以使用map方法从它包含在Optional对象中的值中获取字段的值;

如果需要以连续的逐层方式从对象链的末尾检索字段的值,则不能使用map方法。您需要先使用flatMap,然后使用map方法。

Optional中的map,flatMap和filter方法在概念上与Stream中的相应方法类似。区别在于Optional中最多只有一个元素,这是Stream的一个特例。一个特殊的集合。

不要使用ifPresent和get方法,它们与Optional对象之前的方法基本相同,并且是if-then-else语句的膨胀;

由于“可选”无法序列化,因此在域模型中,不能将字段定义为“可选”。原因是Optional被设计为支持返回Optional对象的语法。如果我们想在域模型中引入Optional,您可以使用以下替代方法:

不要使用Optional对象的底层类型,因为Optional对象的底层类型不支持map,flatMap和filter方法,并且这些方法在Optional中是非常强大的方法。

Java方法可以通过两种方式处理异常:return null(或错误代码);抛出异常,例如:Integer.parseInt(String)。如果此方法无法解析为相应的整数,则抛出NumberFormationException。在这种情况下,我们通常使用try/catch语句来处理异常。

通常,我们建议将try/catch块分别提取到方法中。这里我们使用Optional来设计这个方法。代码如下。在开发中,您可以尝试构建一个OptionalUtility工具类来封装这些复杂的try/catch逻辑。

现在有一种方法可以尝试从属性映射中获取关键字的值。示例代码如下:

使用Optional后,代码如下所示:

如果要访问的属性值不存在,则Properites.getProperty(String)方法的返回值为null。可以使用noNullable工厂方法将该值转换为Optional对象。接下来,您可以使用flatMap将Optional转换为Optional对象。最后,filter用于过滤掉负数,然后你可以使用orElse来获取属性值,如果没有,则返回默认值0.

使用Optional的想法与Stream相同,Stream是一个思想链,类似于数据库查询,具有很强的表现力,并且省略了复杂的try/catch和if-then-else方法。在以后的开发中,您可以使用Optional design API来设计更安全的接口和方法。

本文重点介绍后端技术,JVM故障排除和优化,Java面试问题,个人成长和自我管理主题,为读者提供一线开发人员的工作和成长经验,希望您能在这里获得一些成果。

Javaadu