Sonar : Ersetzen Sie diesen lambda-Ausdruck mit einer Referenz-Methode
Dieses Codebeispiel
Collection<Number> values = transform(
getValuatedObjects(),
input -> getValueProvider().apply(input).getValue());
gegen die sonarqube Regel:
Ersetzen lambdas mit der Methode Verweise, wenn möglich
ist es eine sonar-bug ?
oder kann ich wirklich mit einer Methode Referenz ?
- Es wird einfacher sein, wenn du poste mehr code...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie nicht ersetzen die lambda
input -> getValueProvider().apply(input).getValue()
mit einer Methode Referenz ohne änderung der Semantik.Einer Methode, die Referenz ersetzen single method invocation, also kann es nicht ersetzen Sie einfach einen lambda-Ausdruck, der aus mehr als einem Methodenaufruf.
Einen lambda-Ausdruck der form
input -> getValueProvider().apply(input)
ersetzt werden könnte durchgetValueProvider()::apply
wenn, und nur wenn, die Auswertung der Zeit vongetValueProvider()
spielt keine Rolle, wie die lambda-form wird die Methode aufgerufen wird, auf jeden lambda-Körper Bewertung, während für die Methode Referenz aufgerufen wird, nur einmal und das Ergebnis erfasst.Dies ist ähnlich wie der Unterschied zwischen
x -> System.out.println(x)
undSystem.out::println
wo Lesen Sie den Inhalt des FeldesSystem.out
passiert, zu unterschiedlichen Zeiten aber in der Regel spielt es keine Rolle. Aber Sie sollten sich des Unterschieds bewusst sein.In deinem Beispiel, eine Dritte Methode
getValue()
aufgerufen. Der einzige Weg, um auszudrücken, dass mit der Methode Referenzen braucht eine funktionale Oberfläche wieFunction
die über Methoden wieandThen
- und/odercompose
. Jedoch, die Art, wie Java - 8 arbeitet, erfordern würde, dass Gießen die erste Methode, die die Referenz auf das Ziel-interface zum aufrufen der Kombination-Methode, die wäre auf keine Art leichter zu Lesen ist, dass der lambda-Ausdruck, den Sie jetzt haben:((Function<X,Y>)getValueProvider()::apply).andThen(Y::getValue)
woY
ist der Typ, derapply(input)
gibt.Beachten Sie, dass die Regel sagt "Ersetzen lambdas mit der Methode Verweise wenn möglich" das gibt Ihnen Raum, um zu sagen, "gut, hier ist es unmöglich", allerdings bin ich mir nicht sicher, wie viel Sie können es nennen, eine "Regel" dann...
wenn Sie die Programmierung in java 8 verwenden Sie Methode Referenz an Stelle der lambda-Ausdruck für code lesbar
ersetzen Sie diesen lambda-Ausdruck mit einer Methode, die Referenz
Ersetzen
**
scheint nicht richtig zu?