有没有Java的函数式方法来避免级联的NonNull检查?

huangapple go评论91阅读模式
英文:

Is there any Java Functional approach to avoid cascaded NonNull Checks

问题

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

现在,我有一个使用Objects.nonNull()和短路逻辑AND的以下检查。

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

当我清楚地知道我的意图时,我发现这样做更加冗余且不太易读。

是否有其他方法以函数式的方式处理,以在不面对空指针异常的情况下断言更深层对象的非空状态呢?

英文:

I have gone through several null check related questions in Java and the best practices around it.
After long search , I can see Objects.nonNull () serves the purpose though it looks Orange instead of Apple.

Now i have a following check using Objects.nonNull() and short-circuiting logical AND.

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

I find it is more redundant and less readable when i clearly know my intention.

Is there any other approach to handle it in functional way to assert the non null state of the deeper object without facing Null pointer exception.

答案1

得分: 3

使用 != 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("现在我可以使用我的 obj3 " + x);
                         });
英文:

Using !=null is the normal way to do null-checks, but here's an alternative way that allows you to chain them using Optional.

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

and you can use a lambda expression in place of any of the method references if the code you want to execute is not a simple function call.

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

huangapple
  • 本文由 发表于 2020年7月23日 15:55:29
  • 转载请务必保留本文链接:https://go.coder-hub.com/63049473.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定