Java 8で新たに導入されたメソッド参照(method reference)についてメモ。
メソッド参照は下記の4種類に分類される。
下表はメソッド参照の記法(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
- Method References (The Java™ Tutorials > Learning the Java Language > Classes and Objects)
- The Java Language Specification, Java SE 8 Edition, 15.13. Method Reference Expressions
*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.