yohhoyの日記

技術的メモをしていきたい日記

メソッド参照と等価なラムダ式

Java 8で新たに導入されたメソッド参照(method reference)についてメモ。

メソッド参照は下記の4種類に分類される。

  • [a]staticメソッドへの参照
  • [b]特定オブジェクトのインスタンスメソッドへの参照
  • [c]同一クラス任意オブジェクトのインスタンスメソッドへの参照
  • [d]コンストラクタへの参照

下表はメソッド参照の記法(Class=クラス名, object=変数名、staticMethod/method=メソッド名)と、それぞれ等価なラムダ式を表す。メソッドおよびコンストラクタは引数無しと仮定している。

メソッド参照 等価なラムダ式
[a] Class::staticMethod () -> Class.staticMethod()
[b] object::method () -> object.method()
[c] Class::method t -> t.method()
[d] Class::new () -> new Class()

メソッドまたはコンストラクタが引数を取る場合、宣言順でそのまま仮引数が転送される。例)引数2つを取る場合を下表に示す。

メソッド参照 等価なラムダ式
[a] Class::staticMethod (a, b) -> Class.staticMethod(a, b)
[b] object::method (a, b) -> object.method(a, b)
[c] Class::method (t, a, b) -> t.method(a, b)
[d] Class::new (a, b) -> new Class(a, b)

メモ:メソッド参照式およびラムダ式ともに独立した式(standalone expression)ではなく、多相的な式(poly expression)に区分される。このため、両者とも変数への代入/メソッド実引数/キャスト式のいずれかのように、対象の型(関数型インタフェース)を確定できるコンテキスト以外ではコンパイルエラーとなる。*1

参考URL

*1:JLS 8 §15.13, §15.27: It is a compile-time error if a method reference expression/a lambda expression occurs in a program in someplace other than an assignment context, an invocation context, or a casting context.