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

时间:2018-09-15 08:08:53

标签: java lambda java-8 optional

使用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()方法

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

情况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()才能实现函数式编程风格?

3 个答案:

答案 0 :(得分:2)

我认为,Java Optional仅用于此类用例-为了避免空检查和通过链接进行操作且无需担心NPE。

我认为您没有滥用Optional

Official Article from Oracle

  

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

答案 1 :(得分:2)

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

我们在我的工作场所(在代码审查中)为此进行了很多努力。坦率地说,有时候我会迷失正确的时间(正确的创造者打算阅读的内容)。我什至不认为在创建之时,Stuart Marks和其他人都确定将如何使用这种方法。像Java语言中的任何其他功能一样,它将被滥用,请确保。但是随着时间的流逝,最佳实践将出现,人们将使用它。

我倾向于认为 iff 不会影响性能,您的用法还可以。与其他方法相比,至少它的方法是如此易于阅读(在这里为我自己说话);但同样,这可能是我在做太多(Java-8以上的代码)。

话虽这么说,将其变成一个混乱局面的方法太容易了,这个局限性取决于您(很可能是您的团队)。

答案 2 :(得分:0)

如果initTxDataResponse可为空,那么也许应该像这样吗?

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

response.map(....)