Java8でラムダで書くかメソッド参照で書くかの指針

Java8では、関数型インタフェースへの値として引数が揃ったメソッドの呼び出しを単純に渡す場合に、ラムダの形でもメソッド参照の形でも書くことができます。
このときの書き分けの基準を考えてみます。


つまり、

public void actionPerformed(ActionEvent ae) {
    System.out.println("押された");
}

のようなメソッドがある場合に

JButton b;
b.addActionListener(ae -> actionPerformed(ae));//ラムダ

と書くか、

JButton b;
b.addActionListener(this::actionPerformed);//メソッド参照

と書くかという話です。


まず、この例のactionPerformedメソッドのように、関数型インタフェースに渡すことが前提で定義されたメソッドのような場合は、メソッド参照の形で書いたほうがいいと思います。
ラムダで書いてもいいと思います。


しかし、汎用のメソッドがたまたまメソッド参照でも書けるという場合には、ラムダの形で書いたほうがいいと思います。
つまり、

JButton b;
List<ActionEvent> eventLog;
b.addActionListener(ae -> eventLog.add(ae));//ラムダ

JButton b;
List<ActionEvent> eventLog;
b.addActionListener(eventLog::add);//メソッド参照

のように書かないほうがいいということです。
この場合は、実際にコードを書いていると、なかなか最初からメソッド参照の形では書けないし、引数の情報が消えているので読み解くのも少し苦労します。


ただし、パフォーマンスや実行ファイルサイズが問題になる場合には、メソッド参照で書くほうが今は有利かもしれません。
ラムダは、staticメソッド定義+メソッド参照のシンタックスシュガーとも言えるので、最初からメソッド参照で書いておいたほうが、余計なstaticメソッド定義・呼出がなくなってパフォーマンスやコンパイルサイズで有利になる可能性があります。
コンパイラの最適化があまり賢くなければ、という話で、いま最適化されていなくても、すぐ最適化されるようになると思うので、早々に不要になるテクニックだとは思います。


ということで、まとめとしては、専用に定義したメソッドであればメソッド参照、一般のメソッドはラムダ、パフォーマンスや実行ファイルサイズが気になるならコンパイラ最適化を確認しつつメソッド参照、という感じがいいんではないかなと思います。
このあと滅茶苦茶型推論した。