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

时间:2022-06-30 19:14:27
初看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   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表达式作为参数输入:
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再进行。