我有一个对象,我正在通过rest呼叫进行检索。我需要一个对象。
final Optional aResponse = Optional.ofNullable(restTemplate.getForObject(uri, A.class));
在class中A,它B内部有一个类型的对象。无论出于何种原因,此对象都可以为null。
我试图尽可能安全地查询它,以免出现空指针异常。我尝试这样做:
final Optional<B> bType = aResponse.map(A::getB)
.orElseGet(() -> {
return Optional.empty();
});
但它似乎不起作用。它发出以下消息:Required B but empty was inferred to Optional no instances.
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
您在尝试通过REST调用获取对象A时,希望安全地处理嵌套对象B可能为null的情况。根据您的代码片段,您已经采取了使用Optional来避免空指针异常的正确思路,但遇到了类型不匹配的问题。错误信息提示需要的是B类型,但实际上推断为了Optional.empty(),这意味着返回类型与预期不符。
要解决这个问题,您应该直接从Optional<A>中映射并平坦化(flatten)到Optional<B>,而不是再次封装到另一个Optional中。这是因为当您使用orElseGet时,它期望您提供一个具体类型的值,而非另一个Optional。以下是修正后的代码示例:
final Optional<A> aResponse = Optional.ofNullable(restTemplate.getForObject(uri, A.class));
final Optional<B> bType = aResponse.flatMap(A::getB);
flatMap替代map,这样如果A::getB返回null,整个Optional链将直接得到一个空的Optional,而不会尝试包装一个Optional.empty()。bType就是B类型的Optional,如果B为null,则bType自然就是空的Optional,符合您的需求且避免了类型不匹配的错误。map和flatMap的使用与您的意图相符,尤其是在处理嵌套的Optional时。通过上述调整,您应该能够安全且有效地处理可能为null的嵌套对象问题,同时避免编译时类型错误。