Java 8ラムダ式マスター:関数型プログラミング入門
ラムダ式はJava 8で導入され、Java 8最大の機能と謳われています。ラムダ式は関数型プログラミングを容易にし、開発を大幅に簡素化します。
構文
ラムダ式は以下の構文で特徴づけられます。
parameter -> expression body
ラムダ式の重要な特徴
- 型宣言省略可能 - パラメータの型宣言不要。コンパイラが値から推論
- パラメータの括弧省略可能 - 単一パラメータなら括弧不要。複数パラメータなら必要
- 波括弧省略可能 - 本体が単一ステートメントなら波括弧不要
- returnキーワード省略可能 - 単一式で値を返す場合、コンパイラが自動的に返却。波括弧がある場合はreturn必要
ラムダ式の例
public class Java8Tester {
public static void main(String args[]) {
Java8Tester tester = new Java8Tester();
// 型宣言あり
MathOperation addition = (int a, int b) -> a + b;
// 型宣言なし
MathOperation subtraction = (a, b) -> a - b;
// return文と波括弧あり
MathOperation multiplication = (int a, int b) -> { return a * b; };
// return文なし、波括弧なし
MathOperation division = (int a, int b) -> a / b;
System.out.println("10 + 5 = " + tester.operate(10, 5, addition));
System.out.println("10 - 5 = " + tester.operate(10, 5, subtraction));
System.out.println("10 x 5 = " + tester.operate(10, 5, multiplication));
System.out.println("10 / 5 = " + tester.operate(10, 5, division));
// 括弧なし
GreetingService greetService1 = message -> System.out.println("Hello " + message);
// 括弧あり
GreetingService greetService2 = (message) -> System.out.println("Hello " + message);
greetService1.sayMessage("Mahesh");
greetService2.sayMessage("Suresh");
}
interface MathOperation { int operation(int a, int b); }
interface GreetingService { void sayMessage(String message); }
private int operate(int a, int b, MathOperation mathOperation) {
return mathOperation.operation(a, b);
}
}
実行結果
10 + 5 = 15 10 - 5 = 5 10 x 5 = 50 10 / 5 = 2 Hello Mahesh Hello Suresh
重要なポイント
- ラムダ式は主に関数型インターフェース(単一メソッドのみのインターフェース)のインライン実装定義に使用される。上記例では
MathOperationインターフェースのoperationメソッドとGreetingServiceのsayMessageをラムダ式で実装 - ラムダ式により匿名クラスが不要になり、Javaにシンプルかつ強力な関数型プログラミング能力が追加された
スコープ
ラムダ式では、final変数または実質的にfinalな変数(一度だけ代入される変数)を参照できます。変数に2回目の代入を行うとコンパイルエラーになります。
スコープ例
public class Java8Tester {
final static String salutation = "Hello! ";
public static void main(String args[]) {
GreetingService greetService1 = message -> System.out.println(salutation + message);
greetService1.sayMessage("Mahesh");
}
interface GreetingService { void sayMessage(String message); }
}
実行結果
Hello! Mahesh
Java
- Java演算子をマスター:種類、構文、実践例
- Javaの式、文、ブロックを理解する
- Javaコメント:種類、使い方、ベストプラクティス
- Java拡張forループをマスター:構文、例、ベストプラクティス
- Java文字列をマスター:生成、メソッド、ベストプラクティス
- Javaインターフェース完全ガイド:概念、実装、ベストプラクティス
- Java無名インナークラス完全ガイド:定義、構文、実践例
- Javaのtry-with-resourcesをマスターする:自動リソース管理の仕組みと活用法
- Javaアノテーション完全ガイド:種類、配置場所、実践例
- Javaアサーション完全ガイド:バグ早期発見とコード信頼性の向上
- Java Vectorの理解:使い方、特徴、ArrayListとの比較