Java 7: Получить необязательное вложенное свойство POJO
Я возвращаюсь из фона Swift, возвращаясь к Android, и я привык использовать нотацию этого
let fooOptional = foo?.fooer?.fooest
print(fooOptional)
В Java 8 это возможно:
Optional.of(new Foo())
.map(Foo::Fooer)
.map(Fooer::Fooest)
.ifPresent(System.out::println);
Тем не менее, в Java 7 не существует реального способа сделать это без использования более поздних версий Android, что не работает с нашими минимальными спецификациями SDK. Есть один?
1 ответ
Решение
Если настроенные pojos имеют вызовы get для захвата вложенных свойств, вы можете использовать отражение, чтобы захватить необязательные вызовы get и пройти по гнезду:
public class NestedOptional<T> {
public static <T> Optional<T> fromNullable(Object obj, String... calls) {
if (obj == null) {
return Optional.absent();
}
for (String call: calls) {
try {
obj = obj.getClass().getMethod(call).invoke(obj);
if (obj == null) {
return Optional.absent();
}
} catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
throw new RuntimeException("Couldn't call " + call + "() on " + obj, e);
}
}
return Optional.of(obj);
}
}
Если есть нулевой указатель, он возвратит необязательный объект Guava, который доступен до java 8.
С этим вы можете:
Optional<Fooest> fooOptional = NestedOptional.fromNullable(foo, "getFooer", "getFooest");
if (fooOptional.isPresent()) {
System.out.println(fooOptional.get().toString());
}