声纳:将此lambda替换为方法参考。

时间:2018-07-18 09:23:30

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

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

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 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

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

每次评估谓词函数时,lambda表达式都会评估项aIDetailsDto.getResult().getIdNo(),而在创建Predicate实例并捕获结果值时,方法引用将对其进行评估,以调用{{ 1}}在每个后续谓词评估中对同一对象进行操作。另请参见“ What is the equivalent lambda expression for System.out::println”。

如果假设表达式equals每次都得出相同的结果,则它没有区别,并且由于不反复求值,方法引用可能更有效。

还请注意替代项aIDetailsDto.getResult().getIdNo(),该替代项也将仅对参数表达式求值一次,但它是唯一的变体,用于通过仅接受.filter(Predicate.isEqual(aIDetailsDto.getResult().getIdNo()))来评估其值为null元素(请参见Predicate.isEqual(…))。但是,当假定此值永远不会为null时,其他变体的抛出行为是可取的。

答案 2 :(得分:0)

只需考虑一下您为每个aIDetailsDto.getResult().getIdNo()都叫这个s的事实,这会使它变得更好,也使声纳(和您)感到高兴,那就是将它向上移动一点(并只调用一次):

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