当前位置: 首页 > 知识库问答 >
问题:

SONAR:用方法引用替换此lambda。

欧奇希
2023-03-14

当我在sonar中检查时,结果是:

Replace this lambda with a method reference. 

它实际上指的是:

.filter(s -> aIDetailsDto.getResult().getIdNo().equals(s))

我的代码如下所示:

AIDetailsDto aIDetailsDto = aaaService
        .getDetailsByUserId(userId)
    if (!ObjectUtils.isEmpty(aIDetailsDto)) {
      List<String> kvpValues = callService.getKVPCodes(NewConstants.REMOVED)
          .stream()
          .filter(s -> aIDetailsDto.getResult().getIdNo().equals(s))

我试图改变它,但我得到了一个错误。有人知道如何改变它吗?

共有3个答案

端木昱
2023-03-14

想想你把这个叫做aidetailsdo。getResult()。getIdNo()对于每一个s,让它更好、让sonar(和你)高兴的是,将它向上移动一点(并且只调用一次):

String idNo = aIDetailsDto.getResult().getIdNo();
... stream()
    .filter(idNo::equals)

凌照
2023-03-14

您可以替换过滤器-

lambda表达式将计算术语aIDetailsDto。getResult()。每次求值谓词函数时,getIdNo(),而方法引用将在创建谓词实例时求值,并捕获结果值,以便在每次后续谓词求值时对同一对象调用等于。另请参见“System.out::println的等效lambda表达式是什么”。

如果表达式aIDetailsDto.getResult(). getIdNo()每次都应该计算相同的结果,则没有任何区别,并且由于不重复计算它,方法引用可能会更有效。

另请注意备选方案。filter(谓词.isEqual(aIDetailsDto.getResult())。getIdNo()),它也将只对参数表达式求值一次,但它是唯一一个处理其求值为null,然后只接受null元素的变量(请参见Predicate.isEqual(…))。但是,如果假定此值永远不为null,则最好使用其他变体的抛出行为。

何浩荡
2023-03-14

您应该使用。过滤器(aIDetailsDto.getResult()。getIdNo()::等于)

 类似资料:
  • 索纳尔曲贝的解释是: 方法/构造函数引用比使用lambdas更紧凑、更易读,因此是首选。

  • 我有一个包含错误列表的集合。我想通过一个键(UUID UserId)对它们进行分组。为此,我从以下答案中复制了代码:https://stackoverflow.com/a/30202075/4045364 Sonar Lint告诉我以下错误: 用方法引用替换此lambda<代码>- 我所尝试的: 基于这些问题:SONAR:用方法引用替换此lambda,可运行接口:用方法引用替换此lambda。(未

  • 我编写了代码,从包含日期变量的对象列表中查找最新日期。 <代码>列表。流()。地图(段- 但我发现声纳问题 将此lambda替换为方法引用“Objects::nonNull”。 我无法弄清楚的是,我可以在哪里使用声纳lint问题所述的方法参考。

  • 我通过方法参考获得了关于用lambda替换的声纳信息。但我必须调用字符串上的方法引用???

  • 我想知道这两段代码有什么区别: 第二行编译得很好,但我的 Ecplipse IDE 抱怨“声纳:用方法引用替换这个 lambda”。 如何选择要使用的适当代码?这些都有具体的用例吗?

  • 对于下面的代码,我得到了一个警告,正如我在标题中提到的。谁能告诉我怎么转换这个吗。 在上面的代码中,我有一个对象列表,我想使用lambda表达式从中提取所有主键。但我遇到了类似于“用方法引用替换此lambda。(sonar.java.source未设置。假设为8或更大)。”