【问题标题】:Java 8 avoiding null pointer checks using OptionalJava 8 使用 Optional 避免空指针检查
【发布时间】:2017-03-21 00:21:15
【问题描述】:

是否可以这样写,避免检查元素是否为空和集合是否为空:

 response.getBody()
    .getRequestInformation()
    .getRequestParameters().get(0)
    .getProductInstances().get(0)
    .getResultParameters()

我发现了类似的东西 http://winterbe.com/posts/2015/03/15/avoid-null-checks-in-java/

基本上,我想要实现的是避免具有多个检查天气对象的语句为空或层次结构中的集合为空。我在上面的帖子中读到,这可以通过可选的“Null 检查在后台自动处理”来实现。

如果已经有解决方案,抱歉重复,请参考。

【问题讨论】:

  • 你到底在问什么?如果这与 Java 9 中的新 API 有关,则必须具体说明。
  • winterbe.com/posts/2015/03/15/avoid-null-checks-in-java 的哪一部分有问题?要么执行Optional.map 链,要么捕获 NPE/AIOOBE。
  • 对不起,不是 java 9,错字:)
  • 没有办法准确地写出您所写的内容,除非将整个内容包装在 try/catch 中。要使用Optional,您需要确保您调用的方法确实返回Optional,或者在每一步都使用Optional.of 进行包装。然后,您可以像链接的示例中那样链接 map 调用。

标签: java java-8 optional null-check


【解决方案1】:

如果你想链接Optional,你可以使用它的map(Function<? super T,? extends U> mapper)方法来调用映射器函数,前提是它不是null,并使用flatMap(Stream::findFirst)来获取Collection的第一个元素作为下一个:

Optional<List<ResultParameterClass>> parameters = Optional.ofNullable(response)
    .map(ResponseClass::getBody)
    .map(BodyClass::getRequestInformation)
    .map(RequestInformationClass::getRequestParameters)
    .map(Collection::stream)
    .flatMap(Stream::findFirst)
    .map(RequestParameterClass::getProductInstances)
    .map(Collection::stream)
    .flatMap(Stream::findFirst)
    .map(ProductInstanceClass::getResultParameters);

如果存在Optional,是否可以返回列表,或者如果没有 呈现然后返回类似新的东西 ArrayList&lt;ResultParameterClass&gt;()?

是的,您只需使用orElseGet(Supplier&lt;? extends T&gt; other)orElse(T other) 提供默认值,结果将不再是Optional,而是List&lt;ResultParameterClass&gt;

所以代码将是:

List<ResultParameterClass> parameters = Optional.ofNullable(response)
    ...
    .map(ProductInstanceClass::getResultParameters)
    .orElseGet(ArrayList::new);

【讨论】:

    猜你喜欢
    • 2023-03-31
    • 1970-01-01
    • 1970-01-01
    • 2017-02-18
    • 2022-01-16
    • 1970-01-01
    • 1970-01-01
    • 2019-11-19
    • 1970-01-01
    相关资源
    最近更新 更多