ソナーは「このラムダをメソッド参照に置き換えます」と私に言います
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の説明は次のとおりです。
メソッド/コンストラクタ参照は、ラムダを使用するよりもコンパクトで読みやすいため、推奨されます。
はい、this::createSomeValue
:
private List<SomeValue> createSomeValues(List<Anything> anyList) {
return anyList //
.stream() //
.map(this::createSomeValue) //
.collect(Collectors.toList());
}
この種類の メソッド参照 は "特定のオブジェクトのインスタンスメソッドへの参照" と呼ばれます。この場合、インスタンスcreateSomeValue
のメソッドthis
を参照しています。
ラムダ式を使用することが「良い」かどうかは、意見の問題です。ただし、最初に言語でメソッド参照が追加された理由を説明する この答えBrian Goetz によって記述されたものを参照できます。