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)