2016-02-19 23 views
6

Sonar mi dice "Sostituisci questa lambda con un riferimento metodo"SONAR: sostituire questo lambda con un metodo di riferimento

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); 
    } 

} 

è possibile questo qui? Ho provato diverse cose, come

.map(MyClass::createSomeValue) // 

ma ho bisogno di cambiare il metodo di statico quindi. E io non sono un grande fan dei metodi statici.

Spiegazione dei SonarQube è:

riferimenti Metodo/costruttore sono più compatti e leggibile di utilizzare lambda, e sono quindi da preferire.

risposta

10

Sì, è possibile utilizzare this::createSomeValue:

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

Questo tipo di method reference si chiama "Reference to an instance method of a particular object". In questo caso, ti riferisci al metodo createSomeValue dell'istanza this.


Se è "migliore" o meno che l'uso di un'espressione lambda è una questione di opinione. Tuttavia, è possibile fare riferimento a this answer scritto da Brian Goetz che spiega perché i riferimenti al metodo sono stati aggiunti nella lingua in primo luogo.