为了账号安全,请及时绑定邮箱和手机立即绑定

JAVA 8 中的 NULL 安全对象检查

JAVA 8 中的 NULL 安全对象检查

MYYA 2021-09-03 17:12:05
所以我想对值中包含的值进行空安全检查。所以我有 3 个相互包含的对象:人有一个衣服对象,它有一个带有首都的国家对象所以一个人可能没有衣服,所以像这样的检查会抛出一个空指针:if (person.getClothes.getCountry.getCapital)如果路径上的任何对象为空,我将如何做出这样的声明只返回 false?我也不想这样做。(如果可能的话,Java-8 中的单行。if (person !=null) {    if (person.getClothes != null) {        if (person.getClothes.getCountry !=null) {            etc....        }    }}
查看完整描述

3 回答

?
MMTTMM

TA贡献1869条经验 获得超4个赞

您可以通过 链接所有这些调用Optional::map。我觉得这比 更容易阅读if/else,但它可能只是我


Optional.ofNullable(person.getClothes())

        .map(Clothes::getCountry)

        .map(Country::getCapital)

        .ifPresent(...)


查看完整回答
反对 回复 2021-09-03
?
犯罪嫌疑人X

TA贡献2080条经验 获得超4个赞

这些“级联”空检查确实是偏执和防御性编程。我从一个问题开始,在将输入存储到这样的数据结构之前,让它快速失败或验证输入不是更好吗?


现在来回答这个问题。由于您使用了嵌套空检查,因此您可以使用类似Optional<T>的方法Optional::map来获得更好的控制:


Optional.ofNullable(person.getClothes())

        .map(clothes -> clothes.getCountry())

        .map(country -> country.getCapital())

        .orElse(..)                               // or throw an exception.. or use ifPresent(...)


查看完整回答
反对 回复 2021-09-03
?
小唯快跑啊

TA贡献1863条经验 获得超2个赞

您可以使用单行代码实现

if (person != null && person.getClothes != null && person.getClothes.getCountry != null) { }

如您所知,=和之间存在重大差异==

运算符 && 和 || 是短路的,这意味着如果左侧表达式的值足以确定结果,它们将不会评估其右侧表达式

如果您的第一个表达式为真,那么它只会检查下一个表达式。

如果第一个表达式为假,则不会检查下一个表达式。

因此,根据您的要求,如果 person 不为空,则仅检查person.getClothes != null等等。


查看完整回答
反对 回复 2021-09-03
  • 3 回答
  • 0 关注
  • 186 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信