我有一个对象,我正在通过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
的嵌套对象问题,同时避免编译时类型错误。