Java では、ラムダ式は基本的に関数型インターフェイスのインスタンスを表現します (単一の抽象メソッドを持つインターフェイスは関数型インターフェイスと呼ばれます)。 Java のラムダ式は、入力をパラメータとして受け入れ、結果の値を返す短いコード ブロックであるラムダ関数と同じです。ラムダ式は最近 Java SE 8 に組み込まれました。
Java のラムダ式の機能
ラムダ式は唯一の抽象関数を実装するため、関数インターフェイスを実装します。 ラムダ式は Java 8 で追加され、以下の機能を提供します。
- 機能をメソッドの引数として扱うか、コードをデータとして扱うかを有効にします。
- クラスに属さずに作成できる関数です。
- ラムダ式は、オブジェクトであるかのように受け渡され、オンデマンドで実行できます。
Java ラムダ式の例
ジャワ // Java program to demonstrate lambda expressions // to implement a user defined functional interface. // A sample functional interface (An interface with // single abstract method interface FuncInterface { // An abstract function void abstractFun(int x); // A non-abstract (or default) function default void normalFun() { System.out.println('Hello'); } } class Test { public static void main(String args[]) { // lambda expression to implement above // functional interface. This interface // by default implements abstractFun() FuncInterface fobj = (int x)->System.out.println(2*x); // これは上記のラムダ式を呼び出し、10 を出力します。 fobj.abstractFun(5); } }>>
出力
10>
ラムダ式の構文
lambda operator ->本体>
ラムダ式パラメータ
以下に示す 3 つのラムダ式パラメータがあります。
- ゼロパラメータ
- 単一パラメータ
- 複数のパラメータ
1. パラメータがゼロのラムダ式
() ->System.out.println('ゼロパラメータラムダ');>>
2. 単一パラメータのラムダ式
(p) ->System.out.println('1 つのパラメータ: ' + p);>>
変数の型がコンテキストから推測できる場合、括弧を使用することは必須ではありません。
ジャワ // A Java program to demonstrate simple lambda expressions import java.util.ArrayList; class Test { public static void main(String args[]) { // Creating an ArrayList with elements // {1, 2, 3, 4} ArrayList arrL = 新しい ArrayList (); arrL.add(1); arrL.add(2); arrL.add(3); arrL.add(4); // ラムダ式を使用して、 // arrL のすべての要素を出力します arrL.forEach(n -> System.out.println(n)); // ラムダ式を使用して arrL の偶数要素を出力します // arrL.forEach(n -> { if (n % 2 == 0) System.out.println(n); }); } }>>
出力
1 2 3 4 2 4>
注記: ラムダ式は関数インターフェイスを実装するためにのみ使用できるということです。上記の例でも、ラムダ式は以下を実装します。 消費者 機能的なインターフェイス。
3. 複数のパラメータを含むラムダ式
(p1, p2) ->System.out.println('複数のパラメータ: ' + p1 + ', ' + p2);>>
2 つの引数を持つラムダ式の動作を示す Java プログラム。
ジャワ // Java program to demonstrate working of lambda expressions public class Test { // operation is implemented using lambda expressions interface FuncInter1 { int operation(int a, int b); } // sayMessage() is implemented using lambda expressions // above interface FuncInter2 { void sayMessage(String message); } // Performs FuncInter1's operation on 'a' and 'b' private int operate(int a, int b, FuncInter1 fobj) { return fobj.operation(a, b); } public static void main(String args[]) { // lambda expression for addition for two parameters // data type for x and y is optional. // This expression implements 'FuncInter1' interface FuncInter1 add = (int x, int y) ->x + y; // 2 つのパラメータのラムダ式の乗算 // この式は、 // 'FuncInter1' インターフェース FuncInter1 multiply = (int x, int y) -> x * y; も実装します。 // ラムダを使用したさまざまな実装を使用して操作を呼び出すための Test のオブジェクトを作成します。 // 式 Test tobj = new Test(); // ラムダ式を使用して 2 つの数値を加算します。 System.out.println('加算は ' + tobj.operate(6, 3, add)); // ラムダ式を使用して 2 つの数値を乗算します。 System.out.println('乗算は ' + tobj.operate(6, 3, multiply)); // 単一パラメータのラムダ式 // この式は 'FuncInter2' インターフェイスを実装します FuncInter2 fobj = message -> System.out.println('Hello ' + message); fobj.sayMessage('オタク'); } }>>
出力
Addition is 9 Multiplication is 18 Hello Geek>
注記: ラムダ式は関数と同じように、関数と同じようにパラメーターを受け入れます。
結論
この記事から得られるいくつかの重要なポイントを以下に示します。
- ラムダ式の本体には、ゼロ、1 つ、または複数のステートメントを含めることができます。
- 単一のステートメントがある場合、中括弧は必須ではなく、匿名関数の戻り値の型は本体式の戻り値の型と同じです。
- 複数のステートメントがある場合は、これらを中括弧 (コード ブロック) で囲む必要があり、匿名関数の戻り値の型は、コード ブロック内で返される値の型と同じか、何も返されない場合は void になります。 。
ラムダ式に関するよくある質問
Q1. Javaのラムダ式の種類は何ですか?
答え:
Java ラムダ式は、入力をパラメータとして受け入れ、結果の値を返す短いコード ブロックです。
Q2. Java でラムダ式を使用するのは良いことですか?
答え:
はい、ラムダ式を使用すると、他の API の使用とサポートが容易になります。
Q3. Java ラムダの欠点は何ですか?
答え:
Java ラムダ関数は、関数型インターフェイスでのみ使用できます。
Q4.先ほど示した構文ルールに基づくと、有効なラムダ式は次のうちどれですか?/有効ではありませんか?
- () -> {}
- () -> geeksforgeeks
- () -> { geeksforgeeks を返します;}
- (整数 i) -> geeksforgeeks + i を返します。
- (文字列 s) -> {geeksforgeeks;}
答え:
4 と 5 は無効なラムダで、残りは有効です。詳細:
- このラムダにはパラメータがなく、void を返します。これは、本体が空のメソッド public void run() { } に似ています。
- このラムダにはパラメータがなく、文字列を式として返します。
- このラムダにはパラメータがなく、(ブロック内で明示的な return ステートメントを使用して) String を返します。
- return は制御フロー ステートメントです。このラムダを有効にするには、次のように中括弧が必要です: (Integer i) -> { return geeksforgeeks + i; }。
- 「オタクのためのオタク」は表現であり、声明ではありません。このラムダを有効にするには、次のように中括弧とセミコロンを削除します: (String s) -> geeks for geeks。または、必要に応じて、次のように明示的な return ステートメントを使用することもできます。 (String s) -> { return geeks for geeks; }。