【问题标题】:SONAR: Replace this lambda with a method reference.SONAR:将此 lambda 替换为方法引用。
【发布时间】:2018-12-26 03:40:46
【问题描述】:

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

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))

我尝试更改它,但出现错误。 有谁知道如何改变它?

【问题讨论】:

  • s -&gt; aIDetailsDto.getResult().getIdNo().equals(s) 可以替换为 aIDetailsDto.getResult().getIdNo()::equals,但这会降低 IMO 的可读性,我会抑制或忽略此处的声纳警告
  • @Eugene 我认为可读性与习惯有关。对我来说,使用::equal 对我来说是完全可读的,因为我已经习惯了。另一方面,每当我使用 any lambda 时,我的同事都会对我大喊大叫,因为他发现它非常难以阅读。
  • @Jai 不不,我确实更喜欢方法引用,但不是在 this 情况下
  • 如果表达式是这样的,我该怎么做才能转换为方法引用:- s -&gt; aIDetailsDto.getResult().getIdNo().equals(s.getIdNo())

标签: java lambda java-8 sonarqube method-reference


【解决方案1】:

你应该使用.filter(aIDetailsDto.getResult().getIdNo()::equals)。

【讨论】:

    【解决方案2】:

    想想你为每一个s 调用这个aIDetailsDto.getResult().getIdNo() 的事实,让它变得更好并且也让声纳(和你)高兴的事情就是把它向上移动一点(并且只调用它一次):

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

    【讨论】:

    • ...这也是您通过aIDetailsDto.getResult().getIdNo()::equals 获得的。
    • @Holger 哦,该死的,别忘了这个:(
    【解决方案3】:

    您可以将.filter(s -&gt; aIDetailsDto.getResult().getIdNo().equals(s)) 替换为.filter(aIDetailsDto.getResult().getIdNo()::equals),但您必须注意语义差异。

    lambda 表达式将在每次评估谓词函数时评估术语 aIDetailsDto.getResult().getIdNo(),而方法引用将在创建 Predicate 实例并捕获结果值时对其进行评估,以在相同的情况下调用 equals每个后续谓词评估的对象。另见“What is the equivalent lambda expression for System.out::println”。

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

    还要注意替代.filter(Predicate.isEqual(aIDetailsDto.getResult().getIdNo())),它也将只评估参数表达式一次,但它是处理它评估为null的情况的唯一变体,然后只接受null元素(参见Predicate.isEqual(…) )。但是,当这个值不应该是null 时,其他变体的投掷行为更可取。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-12-14
      • 1970-01-01
      • 2017-10-30
      • 1970-01-01
      • 1970-01-01
      • 2021-06-08
      • 1970-01-01
      相关资源
      最近更新 更多