相关疑难解决方法(0)

检查"get"调用链是否为null

假设我想执行以下命令:

house.getFloor(0).getWall(WEST).getDoor().getDoorknob();
Run Code Online (Sandbox Code Playgroud)

为了避免NullPointerException,我必须在以下情况下执行以下操作:

if (house != null && house.getFloor(0) && house.getFloor(0).getWall(WEST) != null
  && house.getFloor(0).getWall(WEST).getDoor() != null) ...
Run Code Online (Sandbox Code Playgroud)

是否有一种方法或已经存在的Utils类更优雅地执行此操作,让我们说类似下面的内容?

checkForNull(house.getFloor(0).getWall(WEST).getDoor().getDoorknob());
Run Code Online (Sandbox Code Playgroud)

java null nullpointerexception

36
推荐指数
5
解决办法
1万
查看次数

如何在Java 8中实现Elvis运算符?

我有经典的"Elvis运算符"案例,我在这里调用方法,每个方法都可以返回null并将它们链接在一起:

thing?:nullableMethod1(a)?:nullableMethod2(b)?:nullableMethod3()
Run Code Online (Sandbox Code Playgroud)

在Java 8中,我发现的最忠实的实现是这样的:

return Optional.ofNullable(thing)
    .flatMap(x -> Optional.ofNullable(x.nullableMethod1(a)))
    .flatMap(y -> Optional.ofNullable(y.nullableMethod2(b)))
    .flatMap(z -> Optional.ofNullable(z.nullableMethod3()))
Run Code Online (Sandbox Code Playgroud)

我希望Java Optional有类似于elvis运算符的东西:

public<U> Optional<U> elvisOperator(Function<? super T, ? extends U> mapper) {
    return flatMap(t -> Optional.ofNullable(mapper.apply(t));
}
Run Code Online (Sandbox Code Playgroud)

这样我就不必包装每个返回值:

return Optional.ofNullable(thing)
    .elvisOperator(x -> x.nullableMethod1(a))
    .elvisOperator(y -> y.nullableMethod2(b))
    .elvisOperator(Z::nullableMethod3); // also nice
Run Code Online (Sandbox Code Playgroud)

在Java 8中实现Elvis运算符模式是否有更高效和惯用的方法?

java functional-programming optional java-8

11
推荐指数
2
解决办法
3734
查看次数