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("青")); // 青です
}
}
4-6行目は関数型インターフェースです。
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 標準アノテーションのサンプル