-
Type:
Bug
-
Resolution: Cannot Reproduce
-
Priority:
Medium
-
Affects Version/s: 3.2.0
-
Component/s: Instrumentation
-
None
NOT REPRODUCIBLE
In this code sample:
return map.entrySet().stream()
.collect(Collectors.toMap(
Map.Entry::getKey,
e -> e.getValue().getAverage()
));
the Collectors.toMap() takes a "Map.Entry::getKey" method reference as input argument. However, the getKey method is not static.
Wrapping it by Clover's lambdaInc() method leads to a compilation error like this:
[javac] symbol: method lambdaInc(int,Map.Entry::getKey,int)
[javac] location: class __CLR4_0_22ci2cii4lxhoaj
[javac] Foo.java:33: error: invalid method reference
[javac] __CLR4_0_22ci2cii4lxhoaj.lambdaInc(3045,Map.Entry::getKey,3046),
[javac] ^
[javac] non-static method getKey() cannot be referenced from a static context
[javac] where K is a type-variable:
[javac] K extends Object declared in interface Entry
Possible workarounds ??
1) Disable instrumentation of expression-like lambda functions (method references are treated as expression-like lambda) - use instrumentLambda="block" or "none".
2) Wrap such method reference with ///CLOVER:OFF and ///CLOVER:ON keywords, e.g.:
return map.entrySet().stream() .collect(Collectors.toMap( ///CLOVER:OFF Map.Entry::getKey, ///CLOVER:ON e -> e.getValue().getAverage() ));
3) Use a variable with a non-static method reference or change to a lambda expression.
return map.entrySet().stream() .collect(Collectors.toMap( e -> e.getKey(), // unfortunately IDEA suggests to change it back e -> e.getValue().getAverage() ));