Lamda

1.lambda表达式不是必须的,因为其就是一个匿名函数,凡是通过lambda表达式可以完成的工作,都可以通过匿名函数来完成(当然,我们也知道,匿名函数也不是必须的)。

2.lambda表达式可以极大简化我们对匿名函数的使用.

3.学习lambda表达式之前你最好对匿名函数、委托、泛型的概念有所了解。

MSDN定义:Lambda 表达式是一种可用于创建委托表达式目录树类型的匿名函数

通过上面的定义我们可以了解:

1.lambda表达式是匿名函数,只不过长得不太像而已,可以看成是进化版。

2.lambda表达式是用来创建委托或者目录树的匿名函数

目录树是何许人也,放到其他章节说,这里只说lambda表达式创建委托。

  首先,创建一个委托


 

delegate int del(int arg);

  然后创建一个符合这个委托定义的方法

static int Func1(int numb)

        {

            return numb + 10;

        }

  创建委托del的实例,这里创建委托的方法我们用的是最基本的方法。

static void Main(string[] args)

        {

            del d1 = new del(Func1);

            Console.WriteLine(d1(10));

            Console.ReadKey();

        }

  好,上面我们创建了委托del的实例。

我们知道如果一个方法可能只用一次,我们就没必要单独创建这个方法,而是可以使用匿名函数。那么我们假设Func就是那个只使用一次的函数,我们可以将上面的创建委托的实例的代码改为使用匿名函数的版本。

static void Main(string[] args)

       {

           del d1 = delegate(int numb)

           {

               return numb + 10;

           };

           Console.WriteLine(d1(10));

           Console.ReadKey();

       }

  分析一下这个匿名函数:delegaet关键字、匿名函数的参数的类型和形参名称、函数体,还能不能更简单一点呢?继续看,主角来了

static void Main(string[] args)

       {

           del d1 = p => p + 10;

           Console.WriteLine(d1(10));

           Console.ReadKey();

       }

  p=>p+10就是lambda表达式,我们来分析一下,很简单的哟

1.=>读作“成为”、"转成",英文读作"goes to"

2.=>左边的p表示调用方法时给方法传入的参数

3.=>右边的p+10,表示方法体

对比上面使用匿名函数创建委托实例,左边的p就相当于 numb,右边的p+10就相当于{return p+10;}

我们可以乐观的认为,lambda表达式在编译阶段仍然转换成了对应的匿名函数,别问我怎么知道,我猜的!

画张图表示一下。

所以我们前面说过,lambda表达式也是匿名函数,只不过简化了匿名函数的使用。

所以我们前面也说,lambda表达式是用来创建委托的,你看我们刚才不就是再创建委托的实例吗?!

所以到现在为止,你应该记住一句话:lamb表达式没什么特殊之处,只不过是C#的一种语言特性而已,或者说一种语法而已。

道理明白了,下面我们来稍微加强一点。

定义一个两个参数的委托


 

delegate int del(int arg1,int arg2);

  自己试试,首先使用匿名函数的方式创建这个委托的一个实例,然后再使用lambda表达式看看。

  使用匿名函数

del d1 = delegate(int numb1, int numb2)

            {

                return numb1 + numb2;

            };

            Console.WriteLine(d1(10,10));

            Console.ReadKey();

  使用lambda表达式

del d1 = (p, z) => p + z;

           Console.WriteLine(d1(10,10));

           Console.ReadKey();

  没错,两个参数的时候就是使用括号括起来,用都好分割两个参数,这里p就表示numb1,z就表示numb2。

我们稍微弄个复杂点的:定义一个购物的委托

/// <summary>

        /// 定义一个购物的委托,分别接受两个参数

        /// </summary>

        /// <param name="spend">实际消费金额</param>

        /// <param name="cash">付给商家的金额</param>

        /// <returns>商家找回的金额</returns>

        delegate double ShoppingDelegate(double spend, double cash);

  使用匿名方法的方式创建这个委托的实例,方法的逻辑稍微复杂点

ShoppingDelegate d1 = delegate(double spend, double cash)

            {

                /*变量card表示会员卡上的金额,我们都有经验,如果经常会将几毛钱存入会员卡,方便下次使用,这样可以少带零钱。如果会员卡的金额>0.5,则将会使用会员卡上的金额;否则不适用*/

                double card = 0.5;

                if (card > 3)

                {

                    return cash - spend + card;

                }

                else

                {

                    return cash - spend;

                }

            };

  这样该如何改成lambda表达式呢?没错,如果代码比较多的话,lambda表达式也使用{}。


 

ShoppingDelegate d1 = (p,z)=>

            {

                /*变量card表示会员卡上的金额,我们都有经验,如果经常会将几毛钱存入会员卡,方便下次使用,这样可以少带零钱。如果会员卡的金额>0.5,则将会使用会员卡上的金额;否则不适用*/

                double card = 0.5;

                if (card > 3)

                {

                    return z - p + card;

                }

                else

                {

                    return z - p;

                }

            };

  有人会问,为什么lambda表达式中的参数p和z不用spend和cash表示呢?当然可以了,只不过lambda表达式比较叼,能用一个字符表示的,绝对不使用一个半。

好,这一节就到这里,下一节专门说说lambda表达式和linq的配合使用。

时间: 2024-08-11 01:26:32

Lamda的相关文章

JAVA8新特性——Lamda表达式

JAVA9都要出来了,JAVA8新特性都没搞清楚,是不是有点掉队哦~ Lamda表达式,读作λ表达式,它实质属于函数式编程的概念,要理解函数式编程的产生目的,就要先理解匿名内部类. 先来看看传统的匿名内部类调用方式: interface MyInterface{ void lMethod(); } public class Main { public static void test(MyInterface myInterface){ myInterface.lMethod(); } publi

《Java 8 实战》(二)—— Lamda

Lamda表达式可以理解为简洁地表示可传递的匿名函数的一种方式:它没有名称,但它有参数列表/函数主体/返回类型,可能还有一个可以抛出的异常列表. Lamda表达式由参数/箭头和主体组成: (Apple a1, Apple a2) -> a1.getWeight().compareTo(a2.getWeight()); 之前的代码形式: Comparator<Apple> byWeight = new Comparator<Apple>() { public int compa

java中的Lamda语句

java8引入了lamda语句,应用场景如下: 1.代替匿名类 File file = new File("."); 匿名类语句实现文件名过滤: String[] fileList = file.list(new FileNameFilter(){ @Override public boolean accept(File dir, String name){ if (name.endsWith(".java") || new File(name).isDirecto

[.net 面向对象程序设计进阶] (5) Lamda表达式(二) 表达式树快速入门

[.net 面向对象程序设计进阶] (6) Lamda表达式(二) 表达式树快速入门 本节导读: 认识表达式树(Expression Tree),学习使用Lambda创建表达式树,解析表达式树. 学习表达式在程序设计中的优点:比如构造动态查询.动态构造表达式树完成未知对象属性访问,比反射的性能高出很多.我们可以说表达式树才是Lambda的精髓,是我们必须要熟练掌握并灵活运用的. 1.关于表达式树(Expression Tree) 表达式树以树形数据结构表示代码,其中每一个节点都是一种表达式,比如

C#学习记录(七)LINQ语句及LAMDA表达式

LINQ LINQ是一种集成在计算机语言里的信息查询语句,可以让编写者以代码的方式操作数据库. 在C#中,LINQ语句有两种写法. 这是第一种写法 IEnumerable<Customer> result = from customer in customers where customer.FirstName == "Donna“ select customer; 由于这种写法比较容易和SQL语言混淆,所以我更倾向于使用另一种写法 IEnumerable<Customer&g

C++11学习笔记之三lamda表达式,std::function, std::bind

//lamda //first lamda [] {}; // second lamda []() //or no need () when paramater is null { std::cout << "second" << std::endl; }();// last add(), express will call this lamda func // 3 with return type auto kkk = []() { return 1; }()

匿名方法与Lamda表达式

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace 匿名方法与Lamda表达式 { class Program { static void Main(string[] args) { //任何可以使用委托的地方都可以使用匿名方法,匿名方法就是没有名字的方法. //a指向一个匿名方法 Action a

委托、泛型委托、多播委托 和 lamda表达式

委托基本概念:可以把一个方法作为一个参数传给另一个方法 声明:  方法前加 delegate  关键字 列子: using System; using System.Collections; using System.Collections.Generic; namespace Dome { class dom { static void Main(string[] args) { string[] sname = { "Abc", "dFg", "HjK

c++ function &amp;n lamda表达式简单使用

function 定义一个可调用实体 lamda相当于闭包,匿名函数,OC中的block 下面是简答使用的一个demo function <int(int, int)> myfunc;//入参是int,int,出参是int myfunc = [](int x,int y)->int{ return x + y; };//给func赋值 cout << myfunc(10, 20) << endl;//调用 #include "stdafx.h"

Lamda 表达式学习(2) ——lamda 变换

回顾λ-calculus语法: t ::=  terms: x  variable λx.t  abstraction t t  application λ-变换:保持λ-项含义的同时对其进行变换. 1. α-变换:改变被绑定变量的名称,所代表的含义仍是一样的. λx.t → λy.t(x:=y) (将表达式的body t中的所有x的自由出现替换称y) 两个lamda表达式如果可以通过α-变换(可能应用到子项)从一个变换到另外一个,则称他们是全等的. 2. β-规约:对application的变