从对象获取非空值

时间:2018-12-13 22:48:33

标签: java nullpointerexception null

比方说,我有一个Foo类别,该类别具有X,而X具有Y。 我想仅在foo.getX()不是null的情况下才从X获取Y,否则,null如下所示:

Y y = getNonNullValue(foo.getX(), X::getY);

所以我不必做:

if (foo.getX() != null) {
    Y y = foo.getX().getY();
}

我有以下代码

public <T, R> R getNonNullValue(final T t, final Supplier<R> supplier) {
    return ; // What to write here?
}

commons-lang或任何其他库是否具有类似的功能?

2 个答案:

答案 0 :(得分:1)

我不明白您的问题,但是我认为您需要这个:

public <T, R> R getNonNullValue(final T t, final Function<T, R> mapper) {
    return Optional.ofNullable(t)
                    .map(mapper)
                    .orElse(null);
}

或jesper建议:

public <T, R> R getNonNullValue(final T t, final Supplier<R> supplier) {
        return t != null ? supplier.get() : null;
}

答案 1 :(得分:1)

首先,不清楚当getNonNullValue返回foo.getX()时您希望方法null返回什么。假设您希望它返回null,则只需执行以下操作:

public <T, R> R getNonNullValue(final T t, final Supplier<R> supplier) {
    return t != null ? supplier.get() : null;
}

但是,仅当getY是类static中的X方法时,才可以调用它:

// For this to work, X.getY() must be static
Y y = getNonNullValue(foo.getX(), X::getY);

这可能不是您想要的;我认为您想在static返回的对象上调用非getY foo.getX()方法。如果是这种情况,那么您应该像这样调用getNonNullValue

Y y = getNonNullValue(foo.getX(), foo.getX()::getY);

我怀疑这是否会使您的代码比直接编写以下代码更简洁明了:

Y y = foo.getX() != null ? foo.getX().getY() : null;

不幸的是,Java没有像许多其他编程语言一样具有空安全解引用运算符,这会使此操作更加简洁明了。