`

Lambda表达式详解

    博客分类:
  • JAVA
阅读更多

前言

        1、天真热,程序员活着不易,星期天,也要顶着火辣辣的太阳,总结这些东西。

        2、夸夸lambda吧:简化了匿名委托的使用,让你让代码更加简洁,优雅。据说它是微软自c#1.0后新增的最重要的功能之一。

lambda简介

     lambda运算符:所有的lambda表达式都是用新的lambda运算符 " => ",可以叫他,“转到”或者 “成为”。运算符将表达式分为两部分,左边指定输入参数,右边是lambda的主体。

        lambda表达式:

               1.一个参数:param=>expr

               2.多个参数:(param-list)=>expr

        上面这些东西,记着,下面我们开始应用并阐述lambda,让你乐在其中。

lambda应用阐述    

         阐述这技术,我先上一个例子,然后再慢慢深入分析。例子如下:         

 
namespace 阐述lambda
{
    public class Person
    {
        public string Name { get; set; }
        public int Age  {  get;set; }    
    }
    class Program
    {

        public static List<Person> PersonsList()
        {
            List<Person> persons = new List<Person>();
            for (int i = 0; i < 7; i++)
            {
                Person p = new Person() { Name = i + "儿子", Age = 8 - i, };
                persons.Add(p);                
            }
            return persons;
        }

        static void Main(string[] args)
        {
            List<Person> persons = PersonsList();
            persons = persons.Where(p => p.Age > 6).ToList();       //所有Age>6的Person的集合
            Person per = persons.SingleOrDefault(p => p.Age == 1);  //Age=1的单个people类
            persons = persons.Where(p => p.Name.Contains("儿子")).ToList();   //所有Name包含儿子的Person的集合
        }
    }
}
 

     看啦上面的例子,相信你能看出它确实是个甜枣,呵呵,下面我们来看下(p=>p.Age>6)这样的表达式,到底是怎么回事。。

     首先我们看下委托  

 
        //委托  逛超市
        delegate int GuangChaoshi(int a);
        static void Main(string[] args)
        {
            GuangChaoshi gwl = JieZhang;
            Console.WriteLine(gwl(10) + "");   //打印20,委托的应用
            Console.ReadKey();
        }
        
        //结账
        public static int JieZhang(int a)
        {
            return a + 10;
        }
复制代码

    再看表达式

 
        //委托  逛超市
        delegate int GuangChaoshi(int a);
        static void Main(string[] args)
        {          
           // GuangChaoshi gwl = JieZhang;
            GuangChaoshi gwl = p => p + 10;
            Console.WriteLine(gwl(10) + "");   //打印20,表达式的应用
            Console.ReadKey();
        }        
       
 

     委托跟表达式的两段代码,我们可以看出一些东东吧:其实表达式(p => p + 10;)中的 p 就代表委托方法中的参数,而表达式符号右边的 p+10,就是委托方法中的返回结果。 大侠绕道,小虾理解下。

    下面再上两个稍微复杂点的理解理解。

    1.多参数的 

 
        //委托  逛超市
        delegate int GuangChaoshi(int a,int b);
        static void Main(string[] args)
        {            
            GuangChaoshi gwl = (p,z) => z-(p + 10);
            Console.WriteLine(gwl(10,100) + "");   //打印80,z对应参数b,p对应参数a
            Console.ReadKey();
        }
 

        2. lambda主体运算复杂  

复制代码
        /// <summary>
        /// 委托  逛超市
        /// </summary>
        /// <param name="a">花费</param>
        /// <param name="b">付钱</param>
        /// <returns>找零</returns>
        delegate int GuangChaoshi(int a,int b);
        static void Main(string[] args)
        {
            GuangChaoshi gwl = (p, z) =>
            {
                int zuidixiaofei = 10;
                if (p < zuidixiaofei)
                {
                    return 100;
                }
                else
                {
                    return z - p - 10;
                }
           
            };
            Console.WriteLine(gwl(10,100) + "");   //打印80,z对应参数b,p对应参数a
            Console.ReadKey();
        }
 

上面这些例子,好好理解下,下面我要介绍一个系统指定的 Fun<T>委托。

Func<T>委托

 T 是参数类型,这是一个泛型类型的委托,用起来很方便的。

 先上例子

  static void Main(string[] args)
        {
            Func<int, string> gwl = p => p + 10 + "--返回类型为string";            
            Console.WriteLine(gwl(10) + "");   //打印‘20--返回类型为string’,z对应参数b,p对应参数a
            Console.ReadKey();
        }

说明:我们可以看到,这里的p为int 类型参数, 然而lambda主体返回的是string类型的。

再上一个例子

 
        static void Main(string[] args)
        {
            Func<int, int, bool> gwl = (p, j) =>
                {
                    if (p + j == 10)
                    {
                        return true;
                    }
                    return false;
                };
            Console.WriteLine(gwl(5,5) + "");   //打印‘True’,z对应参数b,p对应参数a
            Console.ReadKey();
        }
 

说明:从这个例子,我们能看到,p为int类型,j为int类型,返回值为bool类型。

看完上面两个例子,相信大家应该明白啦Func<T>的用法:多个参数,前面的为委托方法的参数,最后一个参数,为委托方法的返回类型。

 lambda表达式树动态创建方法  

 
   static void Main(string[] args)
        {
            //i*j+w*x
            ParameterExpression a = Expression.Parameter(typeof(int),"i");   //创建一个表达式树中的参数,作为一个节点,这里是最下层的节点
            ParameterExpression b = Expression.Parameter(typeof(int),"j");
            BinaryExpression be = Expression.Multiply(a,b);    //这里i*j,生成表达式树中的一个节点,比上面节点高一级

            ParameterExpression c = Expression.Parameter(typeof(int), "w");
            ParameterExpression d = Expression.Parameter(typeof(int), "x");
            BinaryExpression be1 = Expression.Multiply(c, d);

            BinaryExpression su = Expression.Add(be,be1);   //运算两个中级节点,产生终结点

            Expression<Func<int, int, int, int, int>> lambda = Expression.Lambda<Func<int, int, int, int, int>>(su,a,b,c,d);

            Console.WriteLine(lambda + "");   //打印‘(i,j,w,x)=>((i*j)+(w*x))’,z对应参数b,p对应参数a

            Func<int, int, int, int, int> f= lambda.Compile();  //将表达式树描述的lambda表达式,编译为可执行代码,并生成该lambda表达式的委托;

            Console.WriteLine(f(1, 1, 1, 1) + "");  //打印2
            Console.ReadKey();
        }
 

 

这段代码,放上来,仔细理解下,理解透彻啦,lambda表达式基本上也没什么啦。呵呵。。

算啦,我还是画个图算是结尾吧,以便于理解。

上段代码的lambda表达式树,图。

分享到:
评论

相关推荐

    C++ Lambda表达式详解

    C++ Lambda表达式详解 C++ Lambda表达式是C++语言的一个重要特性,引入于C++11标准中。它可以作为函数对象使用,可以用来替代一些繁琐的函数声明和定义。Lambda表达式的基本语法结构如下:[capture list] ...

    lambda表达式详解

    **Lambda表达式详解** 在Java编程语言中,Lambda表达式是一种简洁、强大的功能,自Java 8开始引入,它使得函数式编程的概念得以实现。Lambda表达式的主要目标是简化处理匿名函数,即没有名字的函数,尤其在处理集合...

    C#匿名委托与Lambda表达式详解

    C#匿名委托与Lambda表达式详解 C#中的匿名委托和Lambda表达式是两个非常重要的概念,它们都是C#语言中函数式编程的重要组成部分。下面我们将详细介绍C#中的匿名委托和Lambda表达式。 一、C#匿名委托 C#中的匿名...

    C++中的Lambda表达式详解

    C++中的Lambda表达式是C++11引入的一项重要特性,它允许我们在程序中定义匿名函数,即没有名称的函数。Lambda表达式的引入极大地方便了函数对象的创建和使用,尤其是在处理函数式编程风格的问题时,如C++标准模板库...

    轻松学C#之委托、事件和Lambda表达式.rar

    在C#编程语言中,委托、事件和Lambda表达式是三个非常重要的概念,它们构成了C#强大功能的基础。本文将详细解析这些知识点,帮助你深入理解并熟练运用它们。 首先,我们来谈谈委托(Delegate)。委托在C#中类似于...

    C++ 中的 Lambda 表达式

    #### Lambda表达式的组成部分详解 - **Capture子句**:Lambda表达式的第一个组成部分是capture子句。这个子句用来指定Lambda表达式可以访问哪些外围作用域中的变量。例如,下面的Lambda表达式捕获了一个名为`x`的...

    Java lambda表达式和JVM字节码功能详解.pdf

    Java Lambda表达式是Java 8引入的一个重要特性,它极大地简化了函数式编程风格的实现。Lambda表达式允许我们将函数作为一个值传递,就像传递其他数据类型一样。这在处理集合、事件驱动编程以及多线程等场景下尤其...

    Python的lambda表达式.pdf

    **Python的Lambda表达式详解** Lambda表达式是Python编程语言中的一个重要特性,它允许程序员创建匿名函数,即没有正式名称的函数。这种功能在需要快速定义小型、一次性的函数时非常有用,尤其在函数式编程风格中。...

    Java8 新特性Lambda表达式实例详解

    Java8 新特性Lambda表达式实例详解 Java8 中引入了Lambda表达式,这是一种函数式编程的方式,它可以使代码变得更加简洁和高效。Lambda表达式可以作为函数式接口的实例,它可以捕获外部变量,实现高效的回调机制。 ...

    Java8 Lambda表达式详解及实例

    Lambda表达式可以访问外部作用域的变量,但这些变量必须是final或即成事实的final(意味着在Lambda表达式创建后不能修改)。这意味着你可以使用Lambda表达式来引用一个只读的局部变量,但不能修改它。 8. **自定义...

    lambda 表达式

    ### Lambda表达式详解 Lambda表达式作为C++0x(即C++11)引入的重大新特性之一,极大地简化了创建函数对象的过程,使得在需要回调函数或自定义比较等场景下,代码更加简洁和直观。lambda表达式允许开发者以更自然的...

    lambda表达式详解及实际运用

    Java 8 引入了 Lambda 表达式,这是一个革命性的特性,极大地简化了函数式编程,使得 Java 开发者可以更加优雅地处理各种编程场景。Lambda 表达式也被称作闭包,因为它能够捕获和存储它被定义时的环境,即它可以访问...

    Java Lambda表达式:简化代码与增强表达力的利器

    ### Java Lambda表达式详解 #### 引言 随着软件开发技术的发展,编程语言也在不断进步以适应更高的效率和更简洁的编码风格。Java作为一种广泛应用于企业级应用开发的语言,在其第八版更新中引入了许多令人期待的新...

    1. lambda 表达式1

    【C++ Lambda 表达式详解】 Lambda 表达式是 C++11 引入的一项重要特性,它提供了一种简洁的创建匿名函数的方法,这些函数可以用于各种场合,如函数对象、回调函数以及算法的自定义比较操作等。Lambda 表达式的语法...

Global site tag (gtag.js) - Google Analytics