当我在声纳中检查它时,结果是:
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))
我尝试更改它,但是出现错误。 有谁知道如何更改它?
答案 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)