所以我想对值中包含的值进行安全的空检查。
所以我彼此之间包含3个对象:
人有一个衣服对象,其中一个国家对象带有一个大写字母
一个人可能没有衣服,所以像这样的检查会抛出一个空指针:
if (person.getClothes.getCountry.getCapital)
如果路径上的任何对象为null,我将如何使这样的语句返回false?
我也不想这样做。 (如果可能,使用Java-8的单行代码。
if (person !=null) {
if (person.getClothes != null) {
if (person.getClothes.getCountry !=null) {
etc....
}
}
}
答案 0 :(得分:8)
您可以通过Optional::map
链接所有这些呼叫。我觉得这比if/else
更容易阅读,但可能只是我
Optional.ofNullable(person.getClothes())
.map(Clothes::getCountry)
.map(Country::getCapital)
.ifPresent(...)
答案 1 :(得分:2)
这些“级联”的null检查实际上是偏执狂和防御性编程。我首先要问一个问题,难道不是让它快速失败或在将输入存储到这样的数据结构之前对其进行验证吗?
现在问这个问题。当您使用嵌套的空检查时,可以使用Optional<T>
和方法Optional::map
进行类似操作,以使您获得更好的控制:
Optional.ofNullable(person.getClothes())
.map(clothes -> clothes.getCountry())
.map(country -> country.getCapital())
.orElse(..) // or throw an exception.. or use ifPresent(...)
答案 2 :(得分:0)
您提到的Java -8
这就是你想要的
Objects.isNull(person) //returns true if the object is null
Objects.nonNull(person) //returns true if object is not-null
Optional.ofNullable(person.getClothes())
.flatMap(Clothes::getCountry)
.flatMap(Country::getCapital)
.ifPresent(...)
通过使用Optional,并且从不使用null,可以完全避免null检查。由于不需要它们,因此您还避免避免导致NPE的空检查。不过,请确保从旧版代码(Map,...)返回的值可以为null,并在Optional中尽快包装。 check here
if(Objects.nonNull(person) && Objects.nonNull(person.getClothes) && Objects.nonNull(person.getClothes.getCountry )){
// do what ever u want
}
如果您使用Collections
并使用org.apache.commons
那么CollectionUtils.isNotEmpty(persons)
和CollectionUtils.isEmpty(persons)
将为您服务。 Persons
是List
个人。
答案 3 :(得分:0)
您可以使用单行代码
if (person != null && person.getClothes != null && person.getClothes.getCountry != null) { }
如您所知,=
和==
之间存在很大差异。
运算符&&和||是短路的,这意味着如果左侧表达式的值足以确定结果,他们将不会评估右侧表达式
如果您的第一个表达式为true,则只有它会检查下一个表达式。
如果第一个表达式为假,则不会检查下一个表达式。
根据您的要求,如果person不为null,则仅检查person.getClothes != null
,依此类推。