编码几年时间,有一个东西似乎一直也逃不过去,那就是lambda表达式。
无论是c#,Python还是Java,lambda的思想都是共通的。但以下的语法和实例为java。
现在就来说说这个看似很难的lambda表达式
lambda表达是实质上就是一个匿名函数
那什么是匿名函数呢?
匿名函数就是没有名字的函数,可以直接嵌入在方法内。里面只包括 函数参数(parameter)+表达式(expression) 或者 函数参数(parameter)+陈述(statements)
PS: 表达式产生值 eg. a+b;2。这两个都属于表达式。 陈述重在操作 比如 if a==b then c=a; c=a+b将xx赋值给xx,或者循环/判断
实际上,陈述也包含了表达式,
因此,我们可以将lambda表达式当成可以输出一个值的函数来使用(把lambda表达式赋给某个值)
语法如下
// no parameter
() -> expression
// one or multi parameters
parameter -> expression
(param1,param2) -> expression
// muiti statements
(param1,param2) -> { statements }
举个例子(JAVA)
(int x, int y) -> x * y;
偷了一张知乎里大哥的图,此为java语法(java 8及以上)
可以看到,图中简略了一整个函数的过程。由之前的嵌套代码变成了一行简洁的代码。
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));}
}
当前方式是用lambda表达式实现接口后,用对应接口的对应函数调用lambda表达式从而得到结果,那有没有更简单的方式呢?真的有!
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));}
}