当前位置: 移动技术网 > IT编程>开发语言>.net > Lambda 表达式

Lambda 表达式

2019年07月22日  | 移动技术网IT编程  | 我要评论

罗群,好心分手吉他谱,提拉鹏

 


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

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网