読者です 読者をやめる 読者になる 読者になる

Hedgehog Note

日々の開発メモです。

Java8 関数型インタフェースとラムダ式

Java8の関数型インタフェースとラムダ式を自分用にまとめ。

関数型インタフェース

インタフェース 主な用途 説明
Supplier<T> T get() 引数なし、戻り値あり
Consumer<T> void accept(T t) 引数あり、戻り値なし
Function<T, R> R apply(T t) 引数あり、戻り値あり
Predicate<T> boolean test(T t) 引数1つの述語

上記以外のメソッドも定義あり。
他にも多数のインタフェースが存在するが基本形はこの4つ。

ラムダ式

文脈 構文
引数なし () -> 処理
単一引数 x -> 処理
複数引数 (x, y) -> 処理
複数行の処理・戻り値なし x -> { 行1; 行2; }
複数行の処理・戻り値あり x -> { 行1; 行2; return 値; }

処理が1行の場合は{ }不要。returnも不要。
単一引数の場合は引数の( )省略可能。
引数の型は省略可能(型推論)。

関数型インタフェースとラムダ式

インタフェース メソッド ラムダ式
Supplier<T> T get() () -> t
Consumer<T> void accept(T t) t -> void
Function<T, R> R apply(T t) t -> r
Predicate<T> boolean test(T t) t -> boolean

基本形の対応表。まずはこの変換を理解する。

メソッド参照とコンストラクタ参照

構文 ラムダ式 関数型インタフェース
A::new () -> new A() Supplier<A>
A::method () -> A.method()
x -> A.method(x)
Supplier<T>
Consumer<X>, Function<X, R>, Predicate<X>
A::method a -> a.method() Consumer<A>, Function<A, R>, Predicate<A>
a::method () -> a.method()
x -> a.method(x)
Supplier<T>
Consumer<X>, Function<X, R>, Predicate<X>

インスタンスメソッドであればthis::methodのようにthisも使える。
上表のラムダ式と関数型インタフェースはあくまで基本形の例示。
シグネチャさえ一致していれば、引数の数に特に制限はない。

※上表の各記載は下記の通り。
“A"はクラス名、"a"はAクラスのインスタンス
"X"はクラス名、"x"はXクラスのインスタンス
methodはインスタンスメソッド、methodは静的メソッド。
"T”, “R"は任意型。

サンプルソース

参考

下記サイトを参考にしました。

http://www.ne.jp/asahi/hishidama/home/tech/java/uptodate.html#JDK1.8