2016-02-19 19 views
6

聲納告訴我SONAR:替換該拉姆達與方法引用

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

} 

這是可能在這裏「有方法參考替換該拉姆達」?我嘗試了幾件事,如

.map(MyClass::createSomeValue) // 

但我需要將方法更改爲靜態然後。我不是靜態方法的忠實粉絲。 SonarQube的

解釋是:

方法/構造的引用比使用lambda表達式更緊湊和可讀性,因此是優選的。

回答

10

是的,你可以使用this::createSomeValue

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

這種method reference被稱爲"Reference to an instance method of a particular object"。在這種情況下,您指的是實例this的方法createSomeValue


無論是「更好」還是不使用lambda表達式是一個意見問題。但是,您可以參考Brian Goetz編寫的this answer,這解釋了爲什麼方法引用是首先在語言中添加的。