2016-02-19 1 views
6

Sonar sagt mich, „Ersetzen Sie dieses Lambda mit einer Methode Referenz“SONAR: Ersetzen Sie dieses Lambda mit einer Methode Referenz

public class MyClass { 

    private List<SomeValue> createSomeValues(List<Anything> anyList) { 
     return anyList // 
       .stream() // 
       .map(anything -> createSomeValue(anything)) // 
       .collect(Collectors.toList()); 
    } 

    private SomeValue createSomeValue(Anything anything) { 
     StatusId statusId = statusId.fromId(anything.getStatus().getStatusId()); 
     return new SomeValue(anything.getExternId(), statusId); 
    } 

} 

Ist das hier möglich? Ich habe verschiedene Dinge versucht, wie

.map(MyClass::createSomeValue) // 

aber ich muss die Methode zu statisch dann ändern. Und ich bin kein großer Fan von statischen Methoden.

Erläuterung der Sonarqube ist:

Methode/Konstruktors Referenzen sind kompakter und lesbar als Lambda verwendet und ist daher bevorzugt.

Antwort

10

Ja, können Sie this::createSomeValue verwenden:

private List<SomeValue> createSomeValues(List<Anything> anyList) { 
    return anyList // 
      .stream() // 
      .map(this::createSomeValue) // 
      .collect(Collectors.toList()); 
} 

Diese Art von method reference wird "Reference to an instance method of a particular object" genannt. In diesem Fall beziehen Sie sich auf die Methode createSomeValue der Instanz this.


Ob es "besser" ist oder nicht, dass die Verwendung eines Lambda-Ausdrucks eine Frage der Meinung ist. Sie können sich jedoch auf this answer von Brian Goetz beziehen, was erklärt, warum Methodenreferenzen in der Sprache an erster Stelle hinzugefügt wurden.

Verwandte Themen