开发者社区 问答 正文

如果存在则如何返回对象,否则返回可选空

我有一个对象,我正在通过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.

展开
收起
垚tutu 2019-11-28 22:36:39 674 分享 版权
阿里云 AI 助理回答

您在尝试通过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,如果Bnull,则bType自然就是空的Optional,符合您的需求且避免了类型不匹配的错误。

注意事项

  • 类型匹配:确保操作符如mapflatMap的使用与您的意图相符,尤其是在处理嵌套的Optional时。
  • Optional设计原则:尽量保持链式调用的简洁性和可读性,避免不必要的复杂结构,使得代码易于理解和维护。

通过上述调整,您应该能够安全且有效地处理可能为null的嵌套对象问题,同时避免编译时类型错误。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答
问答分类:
问答地址: