ラムダ式の基本概念を実践するいくつかの簡単な例:
例 1 - ラムダなしとラムダありの実装の比較
ラムダは使用しません:
MyValueSemLambda1 インターフェース {
ダブル getValue(); // 抽象メソッド
}
クラス MyValueImpl は MyValueSemLambda1{
を実装します
プライベート double 値;
// value
属性を初期化するコンストラクター
public MyValueImpl(double value) {
this.value = 値;
}
// getValue メソッドの実装
@オーバーライド
public double getValue() {
this.value を返す;
}
}
パブリック クラス MyValueSemLambda {
public static void main(String[] args) {
MyValueSemLambda1 myVal = new MyValueImpl(98.6); // 属性に値を割り当てます
System.out.println("値: " myVal.getValue()); // 98.6 を印刷します
}
}
ラムダの使用:
MyValueCompare インターフェース {
double getValue();
}
パブリック クラス MyValueComparacao {
public static void main(String[] args) {
// 属性を持たないラムダ式ですが、値を返します
MyValueCompares myVal = () -> 98.6;
System.out.println("値: " myVal.getValue()); // 98.6 を印刷します
}
}
例 2 - LambdaDemo
// 関数インターフェース。
インターフェース MyValue {
double getValue();
}
// 別の関数インターフェイス。
インターフェース MyParamValue {
double getValue(double v);
}
クラス LambdaDemo {
public static void main(String args[])
{
MyValue myVal; // インターフェース参照を宣言します
// ここで、ラムダ式は単なる定数式です。
// myVal に代入されると、instance
が構築されます
// ラムダ式が
を実装するクラスの
// MyValue.
の getValue() メソッド
myVal = () -> 98.6;単純なラムダ式
//
によって提供される getValue() を呼び出します
// 以前に割り当てられたラムダ式。
System.out.println("定数値: " myVal.getValue());
// 次に、パラメーター化されたラムダ式を作成して割り当てます
// MyParamValue 参照用。このラムダ式は
を返します
// 引数の逆数。
MyParamValue myPval = (n) -> 1.0/n;ラムダ式
パラメータ
があります
// myPval 参照を介して getValue() を呼び出します。
System.out.println("4 の逆数は " myPval.getValue(4.0));
System.out.println("8 の逆数は " myPval.getValue(8.0));
// ラムダ式は定義されたメソッドと互換性がある必要があります
// 関数インターフェースを介して。したがって、次の手順は機能しません:
// myVal = () -> "三つ"; // エラー!文字列は double と互換性がありません!
// myPval = () -> Math.random(); // エラー!パラメータは必須です!
}
}
出力:
定数値: 98.6
4の逆数は0.25
8の逆数は0.125
非互換性の例:
期待される戻り値の型が double の場合、String 値は使用できません。
パラメータを必要とするメソッドは、パラメータを指定しないと使用できません。
関数型インターフェイスは、互換性のあるラムダ式で使用できます。
例 3 - NumericTest
割り算テスト: 最初の数値が 2 番目の数値で割り切れるかどうかを確認します。
サイズ比較: 最初の数値が 2 番目の数値より小さいかどうかを判断します。
絶対値の比較: 2 つの数値の絶対値が等しい場合に true を返します。
// 2 つのパラメータ int と
を取る関数インターフェイス
// ブール値の結果を返します。
インターフェース NumericTest {
ブール値テスト(int n, int m);
}
class LambdaDemo2 {
public static void main(String args[])
{
// このラムダ式は、数値
かどうかを決定します。
// は別の因数です。
NumericTest isFactor = (n, d) -> (n % d) == 0;
if(isFactor.test(10, 2))
System.out.println("2 は 10 の因数です");
if(!isFactor.test(10, 3))
System.out.println("3 は 10 の因数ではありません");
System.out.println();
// このラムダ式は、
の場合に true を返します。
// 最初の引数は 2 番目の引数より小さいです。
NumericTestlessThan = (n, m) -> (n
if(lessThan.test(2, 10))
System.out.println("2 は 10 未満です");
if(!lessThan.test(10, 2))
System.out.println("10 は 2 未満ではありません");
System.out.println();
// このラムダ式は、
の場合に true を返します。
// 引数の絶対値は等しい
NumericTest absEqual = (n, m) -> (n
if(absEqual.test(4, -4))
System.out.println("4と-4の絶対値は等しい。");
if(!lessThan.test(4, -5))
System.out.println("4 と -5 の絶対値は等しくありません。");
System.out.println();
}
}
出力:
2 は 10 の因数です
3 は 10 の因数ではありません
2 は 10 未満です
10 は 2 より小さくありません
4と-4の絶対値は等しい。
4 と -5 の絶対値は等しくありません。
互換性のあるラムダ式は、同じ関数インターフェイスで使用できます。
同じ参照変数を異なるラムダ式で再利用できます。
変数を再利用すると読みやすくなり、コード内のリソースが節約されます。
この例では、同じインターフェースが異なる実装に使用されています:
NumericTest myTest;
myTest = (n, d) -> (n % d) == 0; //実装 1
if(myTest.test(10, 2))
System.out.println("2 は 10 の因数です");
// ...
myTest = (n, m) -> (n
if(myTest.test(2, 10))
System.out.println("2 は 10 未満です");
//...
myTest = (n, m) -> (n
if(myTest.test(4, -4))
System.out.println("4と-4の絶対値は等しい。");
// ...
参照変数による明確さ
さまざまな参照変数 (isFactor、lessThan、absEqual など) を使用すると、各変数がどのラムダ式を表すかを明確に識別するのに役立ちます。
複数パラメータ指定
ラムダ式内の複数のパラメーターは、ラムダ演算子の左側の括弧で囲まれたリスト内でカンマで区切られます。
例: (n, d) -> (n % d) == 0.
ラムダ式でのさまざまな型の使用
関数型インターフェースの抽象メソッドのパラメータや戻り値の型には制限はありません。
String などの非プリミティブ データ型はラムダ式で使用できます。
文字列を使用したテストの例
関数型インターフェイスを使用すると、ある文字列が別の文字列内に含まれているかどうかを確認するなど、特定の文字列関連の条件をテストできます。
// 2 つの文字列をテストする関数インターフェイス。
インターフェース StringTest {
boolean test(String aStr, String bStr);
}
class LambdaDemo3 {
public static void main(String args[])
{
// このラムダ式は、文字列が
であるかどうかを決定します。
// 別の一部。
StringTest isIn = (a, b) -> a.indexOf(b) != -1;
String str = "これはテストです";
System.out.println("テスト文字列: " str);
if(isIn.test(str, "is a"))
System.out.println("「は」が見つかりました。");
それ以外
System.out.println("'is a' が見つかりません。");
if(isIn.test(str, "xyz"))
System.out.println("'xyz' が見つかりました");
それ以外
System.out.println("'xyz' が見つかりません");
}
}
出力:
テスト文字列: これはテストです
「は」が見つかりました。
「xyz」が見つかりません
StringTest 関数インターフェース
ブール値を返す抽象メソッド test(String aStr, String bStr) を定義します。
ラムダ式による実装
ラムダ式 (a, b) -> a.indexOf(b) != -1 は、文字列 (b) が別の文字列 (a) に含まれているかどうかをチェックします。
パラメータでの型推論
パラメータ a と b は String 型であると推論され、indexOf などの String クラスのメソッドを使用できます。
プログラムは、文字列「This is a test」をテストして、部分文字列「is a」と「xyz」が含まれているかどうかを確認し、それに応じて結果を出力します。
以上が動作中のラムダ式の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。