頭脳一式

人の記憶なんて曖昧なもの。すべての情報を頭に記憶するなんてナンセンス。困ったらここに来ればいいじゃん?というスタンスで最強のナレッジベースを目指すブログ

【Java】ラムダ式入門

ラムダ式とは

関数型インターフェース(抽象メソッドを1つ持つインターフェース)の実装に使うことが出来る構文。
->はアロー演算子と呼ぶらしい。かっこいい。
型推論と呼ばれる機能により、型を省略して記述することができる。

ラムダ式の構文

(引数) -> {処理}
これだけ。
ただし、引数の書き方と処理の書き方は複数ある。以下参照。

引数のバリエーション

ラムダ式の引数の書き方は以下の4通りある。

解説
() -> {実装} 引数が0個のときの書き方
(String str) -> {実装} 型と変数名を両方明示的にする書き方
(str) -> {実装} 引数が1個のみの場合、型を省略できる。
str -> {実装} 引数が1個のみでかつ、変数名のみの場合は、カッコを省略できる。
処理のバリエーション

ラムダ式の処理の記述方法は中カッコ{}の有無で大きく以下の2通りある。

処理 説明
() -> {処理1;return 処理2;}; 中カッコ{}がある場合は、処理を複数記述することができる。
rerurnキーワードは明示しなければならない。
() -> 処理1; 中カッコ{}がない場合は、処理は1つしか記述することができない。
さらにrerurnキーワードを省略しなければならない。

Java8で追加された主要な関数型インターフェース

インターフェース名 メソッド名 説明
Function<T, R> R apply(T t) T型の引数を受け取ってR型の結果を戻す「処理」の意。
Consumer< T > void accept(T t) T型の引数を受け取って処理するだけ。
結果を戻さない「消費者」の意。
Supplier T get() 何も引数に取らずに結果を戻す「供給者」の意。
Predicate< T > boolean test(T t) 受け取った引数を評価する「断定」の意。

関数型インターフェースの実装例

Function< T, R > の書き方

例1)Integer型の引数を受け取ってInteger型の値を返す。

Function<Integer,Integer> func = (Integer x) -> {
    return x + 100;
};

System.out.println(func.apply(100));//200

例2)Integer型の引数を受け取ってString型の値を返す。

Function<Integer,String> func2 = (Integer x) -> {
    return Integer.toString(x + 200);
};

System.out.println(func2.apply(100));//300

Consumer< T > の書き方

例1)String型の引数を受け取って消費する。

Consumer<String> con = (String str) -> System.out.println(str);

con.accept("Nyaa!");//Nyaa!

Supplier の書き方

例1)引数を取らずにDATE型の値を返す。

Supplier<Date> sup = () -> {
    Date date = new Date();
    return date;
};

System.out.println(sup.get());//「Mon Jul 02 01:04:38 JST 2018」

例2)固定値を返す。

static String STR = "piyopiyo";

Supplier<String> str = () ->{
    return STR;
};

System.out.println(str.get());//piyopiyo

Predicate< T > の書き方

例1)整数の比較結果を返す。

Integer num = new Integer(100);

Predicate<Integer> pre = (Integer i) ->  i == 100;

System.out.println(pre.test(num));//true