【问题标题】:Is there any Java Functional approach to avoid cascaded NonNull Checks是否有任何 Java 功能方法来避免级联的 NonNull 检查
【发布时间】:2020-11-12 21:32:00
【问题描述】:

我已经研究了几个 Java 中与 null 检查相关的问题以及围绕它的最佳实践。 经过长时间的搜索,我可以看到Objects.nonNull () 可以达到目的,尽管它看起来像橙色而不是苹果。

现在我使用Objects.nonNull() 和短路逻辑与进行了以下检查。

if (Objects.nonNull (obj1) &&
    Objects.nonNull (obj1.getObj2()) &&
    Objects.nonNull (obj1.getObj2().getObj3 ())
{
    obj1.getObj2().getObj3().doSomething();
}

当我清楚地知道我的意图时,我发现它更多余且可读性更低。

是否有任何其他方法可以以函数方式处理它,以断言更深层对象的非空状态而不会遇到空指针异常。

【问题讨论】:

  • 你为什么用Objects.nonNull而不是!=null
  • this 回答你的问题了吗?
  • 为什么不使用Optional?它稍微有点冗长,但仍然没有那么糟糕Optional.ofNullable(obj1).map(o -> o.getObj2()).map(o -> getObj3()).ifPresent(o -> o.doSomething())

标签: java functional-programming null


【解决方案1】:

使用!=null 是进行空值检查的常规方法,但这里有另一种方法,您可以使用Optional 链接它们。

Optional.ofNullable(obj1).map(class1::getObj2)
                         .map(class2::getObj3)
                         .ifPresent(class3::doSomething);

如果您要执行的代码不是简单的函数调用,您可以使用 lambda 表达式代替任何方法引用。

Optional.ofNullable(obj1).map(x -> x.getObj2())
                         .map(x -> x.getObj3())
                         .ifPresent(x -> {
                             System.out.println("Now I can use my obj3 "+x);
                         });

【讨论】:

  • 为了完整起见 - 如果需要默认值,则 orElseorElseGetifPresentOrElse 可以工作。如果没有什么是问题,那么可以使用orElseThrow
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-01-18
  • 1970-01-01
  • 1970-01-01
  • 2019-11-06
  • 2020-12-25
  • 1970-01-01
  • 2020-07-11
相关资源
最近更新 更多