可选ifPresent来调用对象方法

Leo*_*ado 2 java lambda optional sonarlint

我必须使用以下签名调用一个过程:

private Optional<Address> getAddress()
Run Code Online (Sandbox Code Playgroud)

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

Optional<Address> address = getAddress();
if (address.isPresent())
  record.setAddress(address.get());
Run Code Online (Sandbox Code Playgroud)

但是,我收到以下通知:

可以用ifPresent替换

报告条件,如果Optional.isPresent()可以在功能样式中重写.

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

getAddress().ifPresent(x -> record.setAddress(x));
Run Code Online (Sandbox Code Playgroud)

并且认为很好,3行合二为一.但后来我从SonarLint收到了以下消息

用方法引用替换此lambda

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

无论如何,由于我对使用有点新意Optional,我可能会误解这里的一些东西......那么,根据建议和最佳实践,我应该如何编写这段简单的代码呢?

Vad*_*oha 6

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

您可以在Oracle的网站上阅读Java 8中的方法引用:Java教程 - 方法参考.

对于你的情况 - SonarLint只是想让你用这个代替那行:

Record record = ...;
getAddress().ifPresent(record::setAddress);
Run Code Online (Sandbox Code Playgroud)

  • 如果我把Record类,我得到`非静态方法不能从静态上下文`引用,但如果我做`getAddress().ifPresent(record :: setAddress);`(记录是对象)它编译.好吗? (2认同)