JAVA 8 中的 NULL 安全对象检查

新手上路,请多包涵

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

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

Person 有一个 clothes object 有一个 country object 有一个 capital

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

 if (person.getClothes.getCountry.getCapital)

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

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

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

原文由 Blawless 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 559
2 个回答

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

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

原文由 Eugene 发布,翻译遵循 CC BY-SA 4.0 许可协议

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

现在的问题。当您使用嵌套的空检查时,您可以使用 Optional<T> 和方法 Optional::map 执行类似的操作,这可以让您获得更好的控制:

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

原文由 Nikolas Charalambidis 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题