编码几年时间,有一个东西似乎一直也逃不过去,那就是lambda表达式。
无论是c#,Python还是Java,lambda的思想都是共通的。但以下的语法和实例为java。
现在就来说说这个看似很难的lambda表达式
什么是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;
lambda表达式解决了什么问题?
偷了一张知乎里大哥的图,此为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));
}
}
参考
- 介绍什么statement与expression:https://farside.ph.utexas.edu/teaching/329/lectures/node11.html
- Java8-lambda表达式的简单介绍:https://www.geeksforgeeks.org/lambda-expressions-java-8/
- 图片来源:https://www.zhihu.com/question/20125256/answer/324121308