比方说,我有一个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
或任何其他库是否具有类似的功能?
答案 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没有像许多其他编程语言一样具有空安全解引用运算符,这会使此操作更加简洁明了。