假设我有一个类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
或任何其他库是否具有类似的功能?
我不理解你的问题,但我认为你需要这个:
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;
}
首先,当foo.getX()
返回null
时,不清楚您希望方法getNonNullValue
返回什么。假设您希望它返回null
,那么您可以简单地执行以下操作:
public <T, R> R getNonNullValue(final T t, final Supplier<R> supplier) {
return t != null ? supplier.get() : null;
}
但是,如果getY
是X
:类中的static
方法,则只能像您尝试的那样调用它
// For this to work, X.getY() must be static
Y y = getNonNullValue(foo.getX(), X::getY);
这可能不是你想要的;我认为您想对foo.getX()
返回的对象调用非static
getY
方法。如果是这样的话,那么你应该这样调用getNonNullValue
:
Y y = getNonNullValue(foo.getX(), foo.getX()::getY);
我怀疑这是否会使您的代码比直接写以下内容更清晰简洁:
Y y = foo.getX() != null ? foo.getX().getY() : null;
不幸的是,Java不像许多其他编程语言那样有一个空安全的去引用运算符,这将使它更加简洁明了。