数年間コーディングを続けてきた後、常に避けられないと思われることが 1 つあります。それはラムダ式です。
C#でもPythonでもJavaでも、ラムダの考え方は共通です。ただし、以下の構文と例は Java です。
さて、この一見難しそうなラムダ式について話しましょう
ラムダ式とは何ですか?
ラムダ式は本質的には匿名関数です
では、匿名関数とは何でしょうか?
匿名関数は、メソッドに直接埋め込むことができる名前のない関数です。これには、関数パラメーター (パラメーター) + 式 (式) または関数パラメーター (パラメーター) + ステートメント (ステートメント) のみが含まれます。
PS: 式は値を生成します (例: a+b;2)。どちらも表現です。ステートメントは、if a==b then c=a; c=a+b assign xx to xx、またはループ/判定などの演算に焦点を当てています。 実際、
ステートメントには式も含まれているため、ラムダ式を出力する
関数として扱うことができます。使用する値(ラムダ式を値に代入)
構文は次のとおりです
// no parameter
() -> expression
// one or multi parameters
parameter -> expression
(param1,param2) -> expression
// muiti statements
(param1,param2) -> {
statements }
たとえば (JAVA)
(int x, int y) -> x * y;
ラムダ式はどのような問題を解決しますか?
Big Brother Zhihu から画像を盗みました. これは Java 文法 (Java 8 以降) です.
画像では関数全体のプロセスが簡略化されていることがわかります。前のネストされたコードから 1 行の簡潔なコードへ。
アドバンス - インターフェースで使用します
public class Test
{
// 接口FuncInter1中定义了有且仅有一个抽象函数
interface FuncInter1
{
int operation(int a, int b);
}
public static void main(String args[])
{
// 使用lambda表达式的方式实现了FuncInter1接口中的唯一函数
FuncInter1 add = (int x, int y) -> x + y;
FuncInter1 multiply = (int x, int y) -> x * y;
// 使用正常的方式调用接口中的参数即可
System.out.println("Addition is " + add.operation(2, 3));
System.out.println("Multiplication is " + multiply.operation(2, 3));
}
}
現在の方法は、ラムダ式を使用してインターフェイスを実装し、その後、対応するインターフェイスの対応する関数を使用してラムダ式を呼び出し、結果を取得することです。本当に持っています!
public class Test
{
// 依然是原来的接口
interface FuncInter1
{
int operation(int a, int b);
}
// 将接口中的方法封装起来,这样只需要实现方法及输入参数就可以调用了
private int operate(int a, int b, FuncInter1 fobj)
{
return fobj.operation(a, b);
}
public static void main(String args[])
{
FuncInter1 add = (int x, int y) -> x + y;
FuncInter1 multiply = (int x, int y) -> x * y;
// 直接掉用封好的函数
System.out.println("Addition is " + operate(6, 3, add));
System.out.println("Multiplication is " + operate(6, 3, multiply));
}
}
参考
- どのようなステートメントと表現が導入されているか: https://farside.ph.utexas.edu/teaching/329/lectures/node11.html
- Java8 ラムダ式の簡単な紹介: https://www.geeksforgeeks.org/lambda-expressions-java-8/
- 画像ソース: https://www.zhihu.com/question/20125256/answer/324121308