JAVA 8 中的空安全对象检查

2022-09-03 12:29:51

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

所以我有3个对象包含在彼此中:

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

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

if (person.getClothes.getCountry.getCapital)

如果路径上的任何对象为空,我如何使这样的语句返回false?

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

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

答案 1

您可以通过 链接所有这些调用。我发现这比 更容易阅读,但可能只是我Optional::mapif/else

Optional.ofNullable(person.getClothes())
        .map(Clothes::getCountry)
        .map(Country::getCapital)
        .ifPresent(...)

答案 2

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

现在来看看这个问题。由于您已经使用了嵌套的空检查,因此您可以执行类似的操作,并找到一种允许您获得更好控件的方法:Optional<T>Optional::map

Optional.ofNullable(person.getClothes())
        .map(clothes -> clothes.getCountry())
        .map(country -> country.getCapital())
        .orElse(..)                               // or throw an exception.. or use ifPresent(...)