罗群,好心分手吉他谱,提拉鹏
lambda 表达式是一个匿名函数,用它可以高效简化代码,常用作委托,回调
lambda 表达式都使用运算符=>
,所以当你见到这个符号,基本上就是一个 lambda 表达式
lambda 运算符的左边是输入参数(),=>
,右边是表达式或语句块
lambda 表达式,是可以访问到外部变量的
可以将此表达式分配给委托类型
/// <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(); } }
lambda 只有一个参数时,可以省略括号
如果多个参数,则必须加括号,并且用,
隔开
单参数 ,匿名函数:
x => x * x; //传入参数为:x,返回值为 x*x 的值
多参数 ,匿名函数:
(x, y) => x == y;//传入参数为:x,y,返回值为 bool 值
当我们所需的函数返回值为空时,需要指定空返回值
无参数 ,无返回值,匿名函数:
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
当表达式,函数体有多个语句时,只需要将所有代码写入 { 方法体 }
有参数 ,无返回值,匿名函数:
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
调用 linq 的 first 函数
first 函数会找到满足条件,最近的一个
a:是 strlist 数组中的元素,如果元素的长度大于 5 返回满足条件的 a 元素
有参数 ,无返回值,匿名函数:
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
直接将用表达式代替委托类型,可大量精简代码量
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
再举个例子
在动态监听方法时,可直接简化/省略另建方法
并且 lambda 表达式,可以访问到外部变量的
未完。。。
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
如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复
Blazor server side 自家的一些开源的, 实用型项目的进度之 CEF客户端
.NET IoC模式依赖反转(DIP)、控制反转(Ioc)、依赖注入(DI)
vue+.netcore可支持业务代码扩展的开发框架 VOL.Vue 2.0版本发布
网友评论