C++
可以当作匿名函数,c++11加入
语法:[captures] (params) -> ret {Statments;}
Statments :语句
ret:return,返回值的类型
params:参数列表
captures:变量捕获
如:[ ] (int a) -> bool { cout<<a; return true; };
没有返回值(即void)可不写-> ret
,即简写成[ ] (int a) { cout<<a; };
其中captures为捕获外部变量使用:
[ ]:不捕获变量
[&] :引用
[=]:赋值,即拷贝一份
[value]:单独拷贝value
[this]:当前类的this
[&,v1]:多个选项逗号隔开
例子:
int a=10;
[ ]( ) {cout<<a; } //非法
[&]( ) {cout<<a; } //a是引用
[=]( ) {a=10; } //::a不变
C#
Lambda 表达式是一种可用于创建 委托 或 表达式目录树 类型的 匿名函数 。
语法:(params) => {Statments;}
或(params) => expression
。与c++对比,没有方括号,->
变=>
,不能写返回类型ret,返回值类型由被赋值的委托对象决定。
注意:
1.参数类型可不写,当编译器推断困难出错时要显式指定。
2.参数只有一个且无显式指定类型可不用括号包起来,其余情况必需有括号。
3.=>右则为表达式时,如果有返回值则表达式同时充当返回值(相当于隐藏return)。如果是语句块,用回花括号{}括起来即可。注意return value 这种不是表达式是语句,需要花括号
4.c#的var和c++的auto对lambda是有些不同的。c++可直接auto m=(lambda表达式)
获取匿名函数,但在c#中不能用var代替,必须显式的指定类型(类名) m=(lambda表达式)
。这里的类名需要在方法体外(可以类成员or命名空间内)使用特殊的定义方法:
delegate int A(int i); //就是像方法一样定义,前面加关键字delegate,A就能用来定义
....//代码
A a = x => x*x; //形参x与上面的i不需要同名称,跟平时理解的参数相同(实际就是用一个委托对象指向匿名函数)
//或A a = (int x) => x*x;
//或A a = (int x) =>{ return x*x ;};
Java
语法:(params) -> {Statments;}
或(params) -> expression
,就是把c#的=>
又换回->
,其余一个鸟样。如果要像c++和c#一样指向该lambda函数,java用Cosumer
接口去指向,详情右转jdk1.8