• Lambda 表达式



    1

    Lambda —— 表达式


    Lambda 表达式是一个匿名函数,用它可以高效简化代码,常用作委托,回调

    Lambda 表达式都使用运算符=>,所以当你见到这个符号,基本上就是一个 Lambda 表达式

    Lambda 运算符的左边是输入参数(),=>,右边是表达式或语句块

    Lambda 表达式,是可以访问到外部变量的

    可以将此表达式分配给委托类型 
    举个栗子黑白88

    /// <summary>
        /// 控制台程序自己创建的一个测试类
        /// </summary>
        class Chinar
        {
            /// <summary>
            /// 方法A
            /// </summary>
            /// <param name="a">整形</param>
            /// <param name="b">整形</param>
            /// <returns>整形</returns>
            static int MethodA(int a, int b)
            {
                return a + b;
            }
    
    
            static void Main(string[] args)
            {
                //Lambda 表达式不需要声明类型,因为前边3个 int 定义过了 ;=>是固定格式
                //有匿名函数的地方,就可以用 Lambda 表达式来代替
                Func<int, int, int> lambda = (args1, args2) => { return args1 + args2; };
                Console.WriteLine("表达式1:" + lambda(100, 1));
    
                //当传入参数只有一个时,可省略很多
                //不需要括号,不需要return关键字,编译器会自动完成添加
                Func<int, int> lambda2 = a => a * a;
                Console.WriteLine("表达式2:" + lambda2(9));
    
    
                Console.ReadLine();
            }
        }

    2

    Parameter —— 参数


    Lambda 只有一个参数时,可以省略括号

    如果多个参数,则必须加括号,并且用隔开

    举个栗子黑白88 
    单参数 ,匿名函数:

    x => x * x; //传入参数为:x,返回值为 x*x 的值

    多参数 ,匿名函数:

    (x, y) => x == y;//传入参数为:x,y,返回值为 bool 值

    3

    Empty return value —— 空返回值函数


    当我们所需的函数返回值为空时,需要指定空返回值 
    举个栗子黑白88 
    无参数 ,无返回值,匿名函数:

    using UnityEngine;
    
    
    public class ChinarLambda : MonoBehaviour
    {
        delegate void  ChinarDelegate(); //委托 ChinarDelegate ,空返回值,无参数
        ChinarDelegate cd;               //委托对象
    
    
        void Start()
        {
            cd = () => { print("Chinar"); }; //无参数,无返回值,{函数代码块}:打印Chinar
            cd();                            //调用委托
        }
    }

    运行结果:打印

    Chinar

    有参数 ,无返回值,匿名函数:

    using UnityEngine;
    
    
    public class ChinarLambda : MonoBehaviour
    {
        delegate void  ChinarDelegate(int a, int b); //委托 ChinarDelegate ,空返回值,2个 Int 参数
        ChinarDelegate cd;                           //委托对象
    
    
        void Start()
        {
            cd = (a, b) =>{print(a); print(b);}; //传入参数为:a,b,{函数代码块}:分别打印 a b 的值
            cd(1, 2);                            //调用委托
        }
    }

    运行结果:打印

    1
    2

    4

    Lambda Statement —— 表达式 语句


    当表达式,函数体有多个语句时,只需要将所有代码写入 { 方法体 } 
    举个栗子黑白88 
    有参数 ,无返回值,匿名函数:

    using UnityEngine;
    
    
    public class ChinarLambda : MonoBehaviour
    {
        delegate void  ChinarDelegate(string str); //委托 ChinarDelegate ,空返回值,2个 Int 参数
        ChinarDelegate cd;                         //委托对象
    
    
        void Start()
        {
            cd = s =>
            {
                string str = s + "|" + s;
                print(str);
            };            //传入参数为:s,{函数代码块}:
            cd("Chinar"); //调用委托
        }
    }

    运行结果:打印

    Chinar|Chinar

    5

    Example 1 —— 示例1

    调用 LinQ 的 First 函数

    First 函数会找到满足条件,最近的一个

    a:是 strList 数组中的元素,如果元素的长度大于 5 返回满足条件的 元素 
    举个栗子黑白88 
    有参数 ,无返回值,匿名函数:

    using System.Collections.Generic;
    using System.Linq;
    using UnityEngine;
    
    
    public class ChinarLambda : MonoBehaviour
    {
        void Start()
        {
            List<string> strList = new List<string>()//声明一个 string 列表,并添加数据
            {
                "ABC",
                "123456",
                "哈哈",
                "1234567890"
            };
            string result = strList.First(a => a.Length > 5); //LinQ 的 First函数,a:是strList数组中的元素,如果元素的长度大于5;—— First 函数会找到满足条件,最近的一个
            print(strList.First(a => a.Length > 5));          //Lambda 表达式的返回值是根据你的函数决定的,在此是string类型的返回值,所以可以直接写一句
        }
    }

    运行结果:打印

    123456

    6

    Example 2 —— 示例2

    直接将用表达式代替委托类型,可大量精简代码量 
    举个栗子黑白88

    using System;
    using UnityEngine;
    
    
    public class ChinarLambda : MonoBehaviour
    {
        void Start()
        {
            // 1
            //传入参数是 Chinar,所以 s 此时就代表 "Chinar",因为在 LambdaFun 函数中 print(func(str)) 方法,是以传入参数,传给了委托
            //在此经过了 Lambda 直接对 “Chinar” 进行处理,并返回处理后的字符串,直接打印
            LambdaFun("Chinar", s => s.Replace("Chinar", "毋桐"));
    
            // 2
            //原理同上
            LambdaFun("大侦探福尔马林", s =>
            {
                if (s.Contains("马林"))
                {
                    s = s.Replace("马林", "摩斯");
                }
                return s;
            });
        }
    
    
        /// <summary>
        /// 测试表达式函数
        /// </summary>
        /// <param name="str">入参:字符串</param>
        /// <param name="func">入参:Func委托</param>
        public void LambdaFun(string str, Func<string, string> func)
        {
            print(func(str)); //打印 经过委托处理后返回的字符
        }
    }

    运行结果:打印

    123456

    7

    Toggle AddListener Lambda —— 动态添加监听方法 Lambda


    再举个例子

    在动态监听方法时,可直接简化/省略另建方法

    并且 Lambda 表达式,可以访问到外部变量的

    未完。。。 
    举个栗子黑白88

    using UnityEngine;
    using UnityEngine.UI;
    
    
    /// <summary>
    /// Chinar专用测试类
    /// </summary>
    public class ChinarDemo : MonoBehaviour
    {
        void Start()
        {
            //找到组件,动态添加监听,Lambda表达式,精简!外加三目运算
            GameObject.Find("Toggle").GetComponent<Toggle>().onValueChanged.AddListener(isOn => print(isOn ? "开" : "关"));
        }
    
    
        /// <summary>
        /// 直接可省略此方法 —— 监听方法:可手动/动态绑定
        /// 二者效果一样
        /// </summary>
        /// <param name="isOn"></param>
        public void OnClick(bool isOn)
        {
            if (isOn)
            {
                print("开");
            }
            else
            {
                print("关");
            }
        }
    }

    引用:https://www.cnblogs.com/chinarbolg/p/9601422.html
  • 相关阅读:
    awt
    登录校验 简单实现
    事务隔离级别
    事务的四大特性(ACID)
    多线程简单了解
    Eureka bug
    什么是存储过程
    filter和servlet的区别
    说说你对多线程锁机制的理解
    session的生命周期,session何时创建,何时销毁,session销毁的方式
  • 原文地址:https://www.cnblogs.com/nnnnnn/p/11224649.html
Copyright © 2020-2023  润新知