Evil 域

当Evil遇上先知

导航

VB 9.0新特性之Lambda表达式(Lambda Expressions)

Posted on 2008-06-22 11:45  Saar  阅读(3876)  评论(0编辑  收藏  举报
初看VB 9.0,最让人激动人心的特性恐怕是LINQ;最让人摸不差头脑的特性恐怕是Lambda表达式。这两个特征又经常出现在一起,看来没有办法了,就花点儿时间把Lambda这个“该死的字母”给给弄弄清楚吧。
其实,除了名字,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行中,我们把一个函数赋值给了一个变量。粗略一看,就发现这个函数有几个特别的地方:
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 IntegerBoolean))
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表达式作为参数输入:
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再进行。