2016-02-19 14 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"と呼ばれています。この場合、インスタンスthisのメソッドcreateSomeValueを参照しています。


ラムダ式を使用した方が良いかどうかは意見です。しかし、Brian Goetzで書かれたthis answerを参照すると、最初にメソッド参照が言語で追加された理由が説明されています。

関連する問題