Java8-ラムダ式

ラムダ式はJava8で導入され、Java 8の最大の機能であると宣伝されています。ラムダ式は関数型プログラミングを容易にし、開発を大幅に簡素化します。

構文

ラムダ式は、次の構文によって特徴付けられます。

parameter -> expression body

ラムダ式の重要な特性は次のとおりです。

  • Optional type declaration−パラメータの型を宣言する必要はありません。コンパイラーは、パラメーターの値から同じことを推測できます。

  • Optional parenthesis around parameter−括弧内に単一のパラメーターを宣言する必要はありません。複数のパラメーターの場合、括弧が必要です。

  • Optional curly braces −本体に単一のステートメントが含まれている場合、式本体で中括弧を使用する必要はありません。

  • Optional return keyword−本体に値を返す式が1つしかない場合、コンパイラは自動的に値を返します。式が値を返すことを示すには、中括弧が必要です。

ラムダ式の例

たとえば、C:\> JAVAで任意のエディタを使用して、次のJavaプログラムを作成します。

Java8Tester.java

public class Java8Tester {

   public static void main(String args[]) {
      Java8Tester tester = new Java8Tester();
		
      //with type declaration
      MathOperation addition = (int a, int b) -> a + b;
		
      //with out type declaration
      MathOperation subtraction = (a, b) -> a - b;
		
      //with return statement along with curly braces
      MathOperation multiplication = (int a, int b) -> { return a * b; };
		
      //without return statement and without curly braces
      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));
		
      //without parenthesis
      GreetingService greetService1 = message ->
      System.out.println("Hello " + message);
		
      //with parenthesis
      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);
   }
}

結果を確認する

を使用してクラスをコンパイルします javac 次のようにコンパイラ-

C:\JAVA>javac Java8Tester.java

次に、Java8Testerを次のように実行します-

C:\JAVA>java Java8Tester

次の出力が生成されます-

10 + 5 = 15
10 - 5 = 5
10 x 5 = 50
10 / 5 = 2
Hello Mahesh
Hello Suresh

上記の例で考慮すべき重要な点は次のとおりです。

  • ラムダ式は、主に関数型インターフェース、つまり単一のメソッドのみを持つインターフェースのインライン実装を定義するために使用されます。上記の例では、さまざまなタイプのラムダ式を使用して、MathOperationインターフェイスの操作メソッドを定義しました。次に、GreetingServiceのsayMessageの実装を定義しました。

  • Lambda式は、匿名クラスの必要性を排除し、Javaに非常にシンプルで強力な関数型プログラミング機能を提供します。

範囲

ラムダ式を使用すると、任意の最終変数または事実上最終変数(1回だけ割り当てられる)を参照できます。変数に2回目に値が割り当てられると、Lambda式はコンパイルエラーをスローします。

スコープの例

たとえば、C:\> JAVAで任意のエディタを使用して、次のJavaプログラムを作成します。

Java8Tester.java

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);
   }
}

結果を確認する

を使用してクラスをコンパイルします javac 次のようにコンパイラ-

C:\JAVA>javac Java8Tester.java

次に、Java8Testerを次のように実行します-

C:\JAVA>java Java8Tester

次の出力が生成されます-

Hello! Mahesh