web-dev-qa-db-ja.com

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の説明は次のとおりです。

メソッド/コンストラクタ参照は、ラムダを使用するよりもコンパクトで読みやすいため、推奨されます。

14
Chris311

はい、this::createSomeValue

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

この種類の メソッド参照"特定のオブジェクトのインスタンスメソッドへの参照" と呼ばれます。この場合、インスタンスcreateSomeValueのメソッドthisを参照しています。


ラムダ式を使用することが「良い」かどうかは、意見の問題です。ただし、最初に言語でメソッド参照が追加された理由を説明する この答えBrian Goetz によって記述されたものを参照できます。

20
Tunaki