Java 声纳:用方法引用替换此lambda。

Java 声纳:用方法引用替换此lambda。,java,lambda,java-8,sonarqube,method-reference,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(a

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

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))
AIDetailsDto-AIDetailsDto=aaaService
.getDetailsByUserId(用户ID)
如果(!ObjectUtils.isEmpty(aIDetailsDto)){
列出kvpValues=callService.getkvpcode(NewConstants.REMOVED)
.stream()
.filter->aIDetailsDto.getResult().getIdNo().equals)
我试图改变它,但我得到了一个错误。
有人知道如何改变它吗?

你应该使用
.filter(aidetailsdo.getResult().getIdNo()::equals)
想想你对每一个
s
调用这个
aidetailsdo.getResult().getIdNo()
,是什么让它更好,也让sonar(和你)更好快乐,就是把它往上移动一点(并且只叫一次):


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

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

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


另请注意可选的
.filter(Predicate.isEqual(aIDetailsDto.getResult().getIdNo())
,它也将只对参数表达式求值一次,但它是处理求值为
null
的情况的唯一变量,然后只接受
null
元素(请参阅)。但是,如果假定此值永远不为
null
,则其他变量的抛出行为更可取。

s->aIDetailsDto.getResult().getIdNo().equals
可以替换为
aIDetailsDto.getResult().getIdNo()::等于
,但这会降低可读性。在我看来,我会抑制或忽略声纳警告here@Eugene我认为可读性与习惯有关。对我来说,使用
::equal
对我来说是完全可读的,因为我已经习惯了。另一方面,我的同事每当我使用lambda时都会对我尖叫,因为他发现我不,我确实更喜欢方法引用,但不是在这种情况下,如果表达式是这样的话,我可以做什么来转换为方法引用:-
s->aIDetailsDto.getResult().getIdNo().equals(s.getIdNo())
…这也是使用
aidetailsdo.getResult().getIdNo()得到的结果::equals
@Holger噢,该死,别忘了这个:(
String idNo = aIDetailsDto.getResult().getIdNo();
... stream()
    .filter(idNo::equals)