我来自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规范不兼容。有吗?
答案 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());
}