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());
}
Другие вопросы по тегам