トップ 新規 編集 差分 一覧 ソース 検索 ヘルプ PDF RSS ログイン

Javaの文法:関数型インターフェースとラムダ式

 概要

関数型インターフェースとラムダ式はJava8で導入された文法である。Javaで関数型プログラミングを実現するために導入された。関数型インターフェースの条件を満たすメソッドは、メソッド参照という形で変数に代入できる。また、ラムダ式による記述の省略が可能となる。

 関数型インターフェース

  • (抽象)メソッドが一つしかないインターフェース。SAM(Single Abstract Method)タイプのインターフェースとも呼ばれる。
  • @FunctionalInterfaceにより明示的に宣言することができる。以下は、@FunctionalInterfaceのAPIドキュメントでの説明

インタフェース型の宣言を、Java言語仕様に定義されている関数型インタフェースとすることを目的としていることを示すために使われる情報目的の注釈型です。概念上、1つの関数型インタフェースには抽象メソッドが1つだけあります。デフォルト・メソッドには実装が1つ含まれているため、それらは抽象メソッドではありません。インタフェースが、java.lang.Objectのpublicメソッドの1つをオーバーライドする抽象メソッドを宣言する場合も、それはインタフェースの抽象メソッド数に反映されません。理由は、そのインタフェースのいずれかの実装にjava.lang.Objectまたは他の場所からの実装が含まれるからです。

  • 関数型インターフェースの例
@FunctionalInterface
public interface FunctionalInterfaceEx {
    public int func(int i);
}

標準で用意されている関数型インターフェースの例

  • Consumer
    • 値を受け取り、処理を行う。戻り値はない
Consumer<String> printer = System.out::println;
printer.accept("表示する文字列");

 メソッド参照


 ラムダ式

関数型インタフェースの条件を満たすメソッドを実装するさいに、さまざまな省略ができるようにする文法である。

  • 上記の関数型インターフェースの例を従来の匿名クラスで実装すると
FunctionalInterfaceEx funcIntEx = new FunctionalInterfaceEx() {
    @Override
    public int func(int i) {
        return i*10;
    }
};

となるが、これをラムダ式で書くと、

FunctionalInterfaceEx funcIntEx = (int i) -> { return i*10; };

となる。さらに省略可能な部分を省略すると、

FunctionalInterfaceEx funcIntEx = i -> i*10;

となる。

最終更新時間:2015年06月18日 11時47分23秒