JAVA 8 中的 NULL 安全对象检查

所以我想对值中包含的值进行空安全检查。


所以我有 3 个相互包含的对象:


人有一个衣服对象,它有一个带有首都的国家对象


所以一个人可能没有衣服,所以像这样的检查会抛出一个空指针:


if (person.getClothes.getCountry.getCapital)

如果路径上的任何对象为空,我将如何做出这样的声明只返回 false?


我也不想这样做。(如果可能的话,Java-8 中的单行。


if (person !=null) {

    if (person.getClothes != null) {

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

            etc....

        }

    }

}


MYYA
浏览 187回答 3
3回答

MMTTMM

您可以通过 链接所有这些调用Optional::map。我觉得这比 更容易阅读if/else,但它可能只是我Optional.ofNullable(person.getClothes())        .map(Clothes::getCountry)        .map(Country::getCapital)        .ifPresent(...)

犯罪嫌疑人X

这些“级联”空检查确实是偏执和防御性编程。我从一个问题开始,在将输入存储到这样的数据结构之前,让它快速失败或验证输入不是更好吗?现在来回答这个问题。由于您使用了嵌套空检查,因此您可以使用类似Optional<T>的方法Optional::map来获得更好的控制:Optional.ofNullable(person.getClothes())&nbsp; &nbsp; &nbsp; &nbsp; .map(clothes -> clothes.getCountry())&nbsp; &nbsp; &nbsp; &nbsp; .map(country -> country.getCapital())&nbsp; &nbsp; &nbsp; &nbsp; .orElse(..)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// or throw an exception.. or use ifPresent(...)

小唯快跑啊

您可以使用单行代码实现if (person != null && person.getClothes != null && person.getClothes.getCountry != null) { }如您所知,=和之间存在重大差异==。运算符 && 和 ||&nbsp;是短路的,这意味着如果左侧表达式的值足以确定结果,它们将不会评估其右侧表达式如果您的第一个表达式为真,那么它只会检查下一个表达式。如果第一个表达式为假,则不会检查下一个表达式。因此,根据您的要求,如果 person 不为空,则仅检查person.getClothes != null等等。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java