СОНАР: замените эту лямбду ссылкой на метод


Сонар говорит мне: "замените эту лямбду ссылкой на метод"

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 таково:

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

1 ответ:

Да, вы можете использовать this::createSomeValue:

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

Этот видссылки на метод называется"ссылкой на метод экземпляра конкретного объекта". В этом случае вы ссылаетесь на Метод createSomeValue экземпляра this.


Является ли это" лучше " или нет, что использование лямбда-выражения является вопросом мнения. Однако вы можете сослаться на этот ответ , написанный Брайаном Гетцем, который объясняет, почему ссылки на методы были добавлены в язык в первое место.