其实,除了名字,Lambda表达式还是非常好理解的:一个写在一行中的有返回值的匿名函数。抓住它是一个匿名函数的本质,一切都会变得易于理解了。
我们来看一个简单的例子:
1
Dim
lambda
=
Function
(m
As
Integer
) m
*
2
'
What's the class of 'lambda'?
2 Console.WriteLine(lambda( 3 )) ' We use 'lambda' as the name of the function
第1行中,我们把一个函数赋值给了一个变量。粗略一看,就发现这个函数有几个特别的地方:
2 Console.WriteLine(lambda( 3 )) ' We use 'lambda' as the name of the function
1、它没有函数名;
2、它的返回类型是编译器推断出来的;
3、它没有End Function;
4、它“没有”Return,但这个函数有的返回值定义为其签名后听表达式的值。
呵呵,它有这么多特别的地方,因为它就是Lambda表达式; 特别注意,这个匿名函数不是没有返回值,它返回函数签名后的表达式的值,即m*2;我们可以把局部变量lambda看作是这个匿名函数的指针,所以,我们可以通过lambda(3)把参数3传入后调用lambda表达式,屏幕输出结果是6。
OK,Lambda的内容到此结束!
结束了?好像只是说了一个lamdba表达式是一个匿名函数,其返回值为函数签名后的表达式的值……对的,看一下lambda表达式的定义,它不就是这么一个东西吗?
当然,Lambda表达式在使用的时候还是有一些技巧和限制的。
首先,我们可以在定义的时候直接调用Lambda表达式,这样,上面的例子我们就可以改写成:
1
Console.WriteLine((
Function
(m
As
Integer
) m
*
2
)(
3
))
'
merge into 1 line
其次,Lambda表达式可以作为参数使用。仍然借用我们在《
VB 9.0新特性之局部类型推理(Local Type Inference)》一文中的Notebook类来作说明。假设我们需要对笔记本作个分类,分为高端和中低端,价格高于12000的笔记本为高端笔记本,低于的为中低端笔记本。但是,这个价格阈值随着消费水平的变动以及市场的价格的变化会变化,我们创建一个方法IsHighEnd,来输出判断结果。由于这个价格阈值会变,因此,我们把lambda表达式作为判断函数传入——这与代理有着相同的作用。
1
Public
Sub
IsHighEnd(
ByVal
fun
As
Func(
Of
Integer
,
Boolean
))
2 If (fun(_price)) Then
3 Console.WriteLine( " Oh yeah! This is a HighEnd laptop :-) " )
4 Else
5 Console.WriteLine( " Oh no! This not a HighEnd laptop :-( " )
6 End If
7 End Sub
这个方法,将根据函数fun的返回值,来判断一个笔记本是否为高端笔记本。当函数返回true时,输出这是一个高端笔记本;反之。输出这不是一个高端笔记本。调用时,我们就可以把lambda表达式作为参数输入:
2 If (fun(_price)) Then
3 Console.WriteLine( " Oh yeah! This is a HighEnd laptop :-) " )
4 Else
5 Console.WriteLine( " Oh no! This not a HighEnd laptop :-( " )
6 End If
7 End Sub
1
Dim
heLaptop
=
New
Notebook
With
{.Brand
=
"
Lenovo
"
, .Price
=
"
16000
"
}
2 Dim leLaptop = New Notebook With {.Brand = " DELL " , .Price = " 5999 " }
3
4 Dim lambdaIsHighEnd = Function (p) p > 12000
5 heLaptop.IsHighEnd(lambdaIsHighEnd)
6 leLaptop.IsHighEnd(lambdaIsHighEnd)
Lambda表达式的另一个用途就是与.From、.Where等查询关键字共用,来构造查询。但是,由于有LINQ的存在,程序员不一定要去理解LINQ到Lambda表达式的转化。但是,如果能够理解期间的关系,就可以把LINQ运用得更加灵活、*。关于LINQ与Lambda的关系,我想把它放到介绍关完LINQ再进行。
2 Dim leLaptop = New Notebook With {.Brand = " DELL " , .Price = " 5999 " }
3
4 Dim lambdaIsHighEnd = Function (p) p > 12000
5 heLaptop.IsHighEnd(lambdaIsHighEnd)
6 leLaptop.IsHighEnd(lambdaIsHighEnd)