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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM