【问题标题】:Is it good idea to use Optional.of() method to make method chaining?使用 Optional.of() 方法进行方法链接是个好主意吗?
【发布时间】:2019-02-19 21:52:37
【问题描述】:

使用 Optional.of() 方法进行方法链接是个好主意吗?

我与一群同事讨论了 Optional.of() 方法。 目前他们正在使用 Optional.of() 方法的项目之一 实现方法链函数式编程风格。

这里我举个例子:

    TxResponse initTxDataResponse = gateway.initiateTx(initTxDataRequest);
    Optional.of(initTxDataResponse)
            .map(initTxDataResponse::getReturnCode)
            .filter(code -> ResponseCode.SUCCESS.getCode().equals(code))
            .map(code -> {
                // doing some business logic ,we are not
                return code;
            }).orElseThrow(() -> new NoTransactionFound());

我觉得我们过度使用 Optional.of() 方法

在 jdk 8 中使用 Optional.of() 方法来实现函数式编程风格是一种好习惯吗?

案例2:

TxResponse response = transactionRepository.getTransacationById(TransactionId).elseThrow(() -> ResourceNotFoundException());

Optional.of(response)
        .map(response::getReturnCode)
        .filter(code -> ResponseCode.SUCCESS.getCode().equals(code))
        .map(code -> {
            // doing some business logic ,we are not
            return code;
        }).orElseThrow(() -> new RuntimeException());

在这种情况下 Optional.of() 需要实现函数式编程风格?

【问题讨论】:

  • 没有。这不是它的用途。
  • @JBNizet 那你能解释一下它的用途吗?
  • Optional 被设计为一个返回值,表示该值可能为空(常用于Stream 处理结果)。
  • 是的,这就是用例之一。 OP 提到的也是另一个用例,对吧?在不关心 null 值的情况下进行操作?
  • youtu.be/fBYhtvY19xA?t=5m8s。 @PankajSinghal 是的,这是另一个用例。 Optional 不是设计的用例。 youtu.be/fBYhtvY19xA?t=24m51s.

标签: java lambda java-8 optional


【解决方案1】:

我认为,Java Optional 仅适用于这些类型的用例 - 避免空值检查并通过链接进行操作,而无需担心 NPE。

我认为你没有过度使用Optional。

来自Official Article from Oracle

可选的目的不是替换每一个空引用 在你的代码库中,而是帮助设计更好的 API,其中——只是 通过读取方法的签名——用户可以判断是否期望 一个可选值。此外,可选会强制您主动展开 一个可选来处理值的缺失;结果,你 保护您的代码免受意外空指针异常的影响。

【讨论】:

  • Optional.of() 方法只接受非空值。例如,如果我们传递空值,我们最终会再次出现空指针异常。
  • 情况2呢?
【解决方案2】:

如果 initTxDataResponse 可以为空,那么它应该是这样的吗?

Optional<TxResponse> initTxDataResponse = 
        gateway.initiateTx(initTxDataRequest);

response.map(....)

【讨论】:

  • 我相信如果initTxDataResponse 可以为空,那么如果它为空,Optional.of(initTxDataResponse) 会抛出一个NullPointerException。
【解决方案3】:

如果您不介意没有代码的答案,只需我的 0.02 美元。

在我的工作场所(在代码审查中),我们一直在为此争论不休。坦率地说,我有时会不知道它何时正确(由它的创建者阅读)或不正确。我什至不认为在创作时,Stuart Marks 和其他人确定如何(ab)使用它。与 Java 语言中的任何其他功能一样,它会被滥用,请务必确认。但随着时间的推移,最佳实践会出现,人们会使用它。

我倾向于认为 iff 它不会影响性能,您的使用还可以。与 if else 检查相比,至少它很容易阅读(在这里为我自己说话);但同样可能是我做了(太多)Java-8 及更高版本的代码。

话虽如此,把它变成一团糟太容易了,这个界限在哪里,取决于你(很可能是你的团队)。

【讨论】:

    猜你喜欢
    • 2011-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多