这看起来像是一个原始问题,或者可以通过我不知道的简单实用程序库方法来完成。
目标是检查嵌套在两个对象下的布尔字段的值。
private boolean sourceWebsite(Registration registration) {
Application application = registration.getApplication();
if (application == null) {
return true;
}
Metadata metadata = application.getMetadata();
if (metadata == null) {
return true;
}
Boolean source = metadata.getSource();
if (source == null) {
return true;
}
return !source;
}
我知道这可以在单个if()
中完成。为了便于阅读,我在这里添加了多个if
。
有没有一种方法可以简化上面的if
语句,并有一个简单的实用工具类,如果父对象为null或不为null,则该类返回Boolean source
的值?
答案 0 :(得分:38)
您可以通过以下方式使用java.util.Optional
:
private boolean sourceWebsite(Registration registration) {
return Optional.of(registration)
.map(Registration::getApplication)
.map(Application::getMetadata)
.map(Metadata::getSource)
.map(source -> !source)
.orElse(Boolean.TRUE);
}
简而言之,如果任何getter返回null,则返回true
,否则返回!Metadata.source
。
答案 1 :(得分:15)
如果其中任何一个为null,则以下内容将返回true。如果所有值都不为空,则返回!source
。
private boolean sourceWebsite(Registration registration) {
return registration.getApplication() == null
|| registration.getApplication().getMetadata() == null
|| registration.getApplication().getMetadata().getSource() == null
|| !registration.getApplication().getMetadata().getSource();
}
已更新:
如果您希望每个getter不被多次调用,则可以为每个对象声明变量
private boolean sourceWebsite(Registration registration) {
Application application;
Metadata metadata;
Boolean source;
return (application = registration.getApplication()) == null
|| (metadata = application.getMetadata()) == null
|| (source = metadata.getSource()) == null
|| !source;
}
答案 2 :(得分:2)
您可以使用的另一个选项是try-catch块。如果出现空指针异常,则返回true。
private boolean sourceWebsite(Registration registration) {
try {
return !registration.getApplication().getMetadata().getSource();
}
catch (NullPointerException e) {
return true;
}
}
答案 3 :(得分:-2)
您可以使用类似下面的方法:
public static Object get(Object o, String... m) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException {
if (o == null || m.length == 0) {
return null;
}
for (String m1 : m) {
o = o.getClass().getMethod(m1).invoke(o);
if (o == null) {
return null;
}
}
return o;
}
并这样称呼它:
Boolean source = (Boolean) get(registration, "getApplication", "getMetadata", "getSource");
return source == null ? false : !source;
但是在任何严肃的项目中我都不会这样做。