【问题标题】:Optional ifPresent to call an object method可选的 ifPresent 调用对象方法
【发布时间】:2018-01-03 14:56:51
【问题描述】:

我必须调用具有以下签名的过程:

private Optional<Address> getAddress()

我用它来填写我系统上的客户记录。因此,我编写了以下代码来设置记录的地址(如果存在)。

Optional<Address> address = getAddress();
if (address.isPresent())
  record.setAddress(address.get());

但是,我收到以下通知:

可以用ifPresent代替

报告条件,例如 if Optional.isPresent(),可以重写为函数式。

所以我觉得 很好,我将使用这个很酷的 ifPresent 东西来简化我的代码。然后我想出了这一行:

getAddress().ifPresent(x -> record.setAddress(x));

觉得不错,三行合一。但后来我收到了来自 SonarLint

的以下消息

用方法引用替换这个 lambda

我想为什么我需要创建一个方法来设置单个变量?

无论如何,由于我对Optional 的使用有点陌生,我可能在这里误解了一些东西......那么,根据建议和最佳实践,我应该如何制作这段简单的代码?

【问题讨论】:

    标签: java lambda optional sonarlint


    【解决方案1】:

    您不应该仅仅为了设置单个变量而创建新方法。 SonarLint 只是建议最好使用方法引用而不是 lambda 表达式。

    您可以在 Oracle 网站上阅读 Java 8 中的方法引用:The Java Tutorials - Method References

    对于您的情况 - SonarLint 只是希望您用以下内容替换该行:

    Record record = ...;
    getAddress().ifPresent(record::setAddress);
    

    【讨论】:

    • 如果我放 Record 类,我得到 Non static method cannot be referenced from a static context,但如果我放 getAddress().ifPresent(record::setAddress);(record 是对象)它编译。没事吧?
    • 使用变量名而不是Record,在您的示例中为record
    • 正确,应该使用记录而不是记录。谢谢,@lucasvw
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-19
    • 2017-09-08
    • 1970-01-01
    • 1970-01-01
    • 2010-11-02
    相关资源
    最近更新 更多