Java ラムダ式の仕組みとサンプル

Javaのラムダ式の仕組みとサンプルです。

目次

サンプル ラムダ式とは
  ラムダ式のサンプル
匿名クラスからラムダ式に変更する
  関数型インターフェースを使用する

ラムダ式とは

インターフェース名 変数 = ( [データ型] 引数 [,データ型 引数]... ) ->
   { メソッドの処理
    }
  • 矢印(->)の左側に引数を指定します。データ型は省略可能です。
  • 矢印(->)の右側に引数を受け取って行うメソッドの処理を記述します。
    →このメソッドは、関数型インタフェースのメソッドをオーバーライドします。
  • 関数型インターフェースとは実装するメソッドがひとつだけのインターフェースです。
    →関数型インターフェースであるかは@FunctionalInterfaceアノテーションで確認できます。
  • 匿名クラスをラムダ式に変更することができます。
  • Java8で導入されました。
  • 以下は、Oracleのラムダ式のリンクです。
    https://www.oracle.com/technetwork/jp/articles/java/architect-lambdas-part1-2080972-ja.html

ラムダ式のサンプル

package test1;

@FunctionalInterface
interface Color {
	String write(String str);
}
public class Test1 {
	public static void main(String[] args) {

		Color c1 = (a) -> {return a + "です";};
		System.out.println(c1.write("赤")); // 赤です

		Color c2 = a -> a + "です";
		System.out.println(c2.write("青")); // 青です
	}
}

10,13行目は、ラムダ式です。
丸かっこ()で引数を指定し、矢印の右側で値を返します。
13行目は、10行目の丸かっこと波かっこがないパターンです。

3行目の@FunctionalInterfaceは、インターフェースのメソッドが1つか確認し、1つでない場合にエラーにします。この例ではwriteメソッドのみなのでエラーになりません。
インターフェースが関数型インターフェースかチェックします。

ラムダ式の引数が2つある場合

package test1;

@FunctionalInterface
interface Color {
	String write(String str1, String str2);
}
public class Test1 {
	public static void main(String[] args) {

		Color c1 = (a, b) -> {
			return a + "と" + b + "です";
		};
		System.out.println(c1.write("赤", "青")); // 赤と青です
	}
}

インターフェースのメソッドの引数も2つになっています。

匿名クラスからラムダ式に変更する

匿名クラスからラムダ式に変更することができます。

1.匿名クラス

package test1;

@FunctionalInterface
interface Color1 {
	String write1(String a);
}
public class Test1 {
	public static void main(String[] args) {

		Color1 c1 = new Color1() {
			@Override
			public String write1(String a) {
				return a + "です";
			}
		};
		String b = c1.write1("青");
		System.out.println(b); //青です
	}
}

4-6行目は、独自に作成した関数型インターフェースです。
3行目の@FunctionalInterfaceは関数型インターフェースであることを示します。
10-15行目は、匿名クラスです。
10行目のColor1は4行目のインターフェースを指していて実装しています。
→Color1は、クラス名ではありません。

2.ラムダ式

上記の匿名クラスをラムダ式に変更したサンプルです。

package test1;

@FunctionalInterface
interface Color1 {
	String write1(String a);
}
public class Test1 {
	public static void main(String[] args) {
		
		Color1 c1 = (String a) -> {return a + "です";};
		
		String b = c1.write1("青");
		System.out.println(b); //青です
	}
}

10行目がラムダ式です。関数型インタフェースの5行目のメソッドの内容を記述しています。
矢印の左側の(String a)が引数で、矢印の右側が引数を受け取って行う処理です。

関数型インターフェースを使用する

上記の3~6行目のインターフェースは、常に作成する必要はありません。
予め代わりとなる関数型インターフェースが用意されています。

上記の引数あり+戻り値ありの場合は、Functionインターフェースを使用します。

以下は、関数型インターフェースのFunctionを使用したサンプルです。

package test1;
import java.util.function.Function;
//@FunctionalInterface
//interface Color1 {
//	String write1(String a);
//}
public class Test1 {
	public static void main(String[] args) {
		
//		Color1 c1 = (String a) -> {return a + "です";};
		Function <String,String> c1 = (String a) -> {return a + "です";};
		
//		String b = c1.write1("青");
		String b = c1.apply("青");
		System.out.println(b); //青です
	}
}

2行目は、Functionをインポートしています。
14行目のapplyは、Functionインターフェスのメソッドです。

主な関数型インターフェースについては以下を参照願います。
Java ラムダ式で関数型インターフェースを使用

関連の記事

Java ラムダ式で関数型インターフェースを使用
Java 匿名クラスのサンプル
Java 標準アノテーションのサンプル

△上に戻る