2016-02-19 4 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 является:

ссылка Метод/Конструктор является более компактной и читаемой, чем при использовании лямбды, и поэтому предпочтительна.

ответ

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". В этом случае вы ссылаетесь на метод createSomeValue экземпляра this.


Является ли это «лучше» или нет, что использование выражения лямбда - это вопрос мнения. Однако вы можете обратиться к this answer, написанному Brian Goetz, что объясняет, почему в этом языке были добавлены ссылки на методы.