前回のサンプルコードを参考に、ラムダ式と関数型インタフェースの関係を見てみます。
前回:ラムダ式で降順ソートを書いてみよう
関数型インタフェース
Consumerインタフェース
前回の出力用のメソッドです。
private static void printList(List<String> list) {
list.forEach(program -> System.out.println(program));
}
繰り返しに使われるforEachメソッドは、Consumerインタフェースを引数に取ります。
JavaDocを覗いてみると、、、
@FunctionalInterface
public interface Consumer<T> {
/**
* Performs this operation on the given argument.
*
* @param t the input argument
*/
void accept(T t);
・・・
- @FunctionalInterfaceが付与されており、これは関数型インタフェースを表す
- 関数型インタフェースは、ただ1つの抽象メソッドを持つ
となっています。
つまり、関数型インタフェースに対して、ラムダ式を適用できそうですね!
他の関数型インタフェースの例
1.8で追加されたもの
- Interface Function<T,R> :1つの引数を受け取って結果を返す抽象メソッドを持つ
- Interface BiFunction<T,U,R> :2つの引数を受け取って結果を返す抽象メソッドを持つ
- Interface Predicate<T> :1つの引数を受け取る条件式を持つ
- Interface BiPredicate<T,U> :2つの引数を受け取る条件式を持つ
1.8以前から存在する以下も、関数型インタフェースの一部
最後に
ラムダ式と関数型インタフェースの関係が分かりました。
ただ、記述は簡略化されるが、それほど旨味は感じないですね。
どうやら、Java8で追加されたStream APIと組みわせると・・!?
では、次回。