java 7:获取可选的嵌套POJO属性

时间:2017-12-04 01:18:29

标签: java android guava java-7

我来自Swift背景,跳回到Android,我曾经使用过这个符号

let fooOptional = foo?.fooer?.fooest
print(fooOptional)

在java 8中,this is possible

Optional.of(new Foo())
    .map(Foo::Fooer)
    .map(Fooer::Fooest)
    .ifPresent(System.out::println);

然而,在java 7中,没有真正开箱即用的方法可以不使用Android的更高版本,这与我们的最低SDK规范不兼容。有吗?

1 个答案:

答案 0 :(得分:0)

如果设置的pojos具有抓取嵌套属性的getter调用,则可以使用反射来获取可选的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之前可用。

有了这个,你可以:

Optional<Fooest> fooOptional = NestedOptional.fromNullable(foo, "getFooer", "getFooest");
if (fooOptional.isPresent()) {
    System.out.println(fooOptional.get().toString());
}