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

转载于:https://www.cnblogs.com/nnnnnn/p/11224649.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值