1 Lambda —— 表達式 Lambda 表達式是一個匿名函數,用它可以高效簡化代碼,常用作委托,回調 Lambda 表達式都使用運算符=>,所以當你見到這個符號,基本上就是一個 Lambda 表達式 Lambda 運算符的左邊是輸入參數(),=>,右邊是表達式或語句塊 Lambda 表達式,是 ...
1
Lambda —— 表達式
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();
}
}
2
Parameter —— 參數
Lambda 只有一個參數時,可以省略括弧
如果多個參數,則必須加括弧,並且用,
隔開
單參數 ,匿名函數:
x => x * x; //傳入參數為:x,返回值為 x*x 的值
多參數 ,匿名函數:
(x, y) => x == y;//傳入參數為:x,y,返回值為 bool 值
3
Empty return value —— 空返回值函數
當我們所需的函數返回值為空時,需要指定空返回值
無參數 ,無返回值,匿名函數:
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 —— 表達式 語句
當表達式,函數體有多個語句時,只需要將所有代碼寫入 { 方法體 }
有參數 ,無返回值,匿名函數:
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 返回滿足條件的 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
6
Example 2 —— 示例2
直接將用表達式代替委托類型,可大量精簡代碼量
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 表達式,可以訪問到外部變數的
未完。。。
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