Lambda語(yǔ)法筆記(一)

基礎(chǔ)語(yǔ)法

  1. 無(wú)參數(shù)的情況 :
    val/var 變量名 = { 操作的代碼 }

  2. 有參數(shù)的情況
    val/var 變量名 : (參數(shù)的類型,參數(shù)類型,...) -> 返回值類型 = {參數(shù)1,參數(shù)2,... -> 操作參數(shù)的代碼 }

可等價(jià)于

// 此種寫法:即表達(dá)式的返回值類型會(huì)根據(jù)操作的代碼自推導(dǎo)出來(lái)。

val/var 變量名 = { 參數(shù)1 : 類型,參數(shù)2 : 類型, ... -> 操作參數(shù)的代碼 }

  1. lambda表達(dá)式作為函數(shù)中的參數(shù)的時(shí)候,這里舉一個(gè)例子:
    fun test(a : Int, 參數(shù)名 : (參數(shù)1 : 類型,參數(shù)2 : 類型, ... ) -> 表達(dá)式返回類型){
    ...
    }

源碼

// 傳入兩個(gè) int 值,返回之和
fun test(a : Int , b : Int) : Int{

    return a + b
    
}

lambda

1 . val test : (Int , Int) -> Int = {a , b -> a + b}

// 或者

2 . val test = {a : Int , b : Int -> a + b}

第一種: 會(huì)限制返回值類型

  • 在變量名后面接上傳入的參數(shù)
  • "->"后為返回值類型
  • "{**}" 內(nèi) "->"前為傳入的參數(shù)名
  • "{**}" 內(nèi) "->"后為具體的方法

第二種: 不會(huì)限制返回值類型

  • "{**}" 內(nèi) "->"前為傳入的參數(shù)名和參數(shù)類型
  • "{**}" 內(nèi) "->"后為具體的方法

返回值確定規(guī)則

"{**}" 內(nèi) "->"后,最后一個(gè)參數(shù)或者函數(shù)為默認(rèn)返回值,不需要用 return

不同操作之間需要用回車區(qū)分(不能在同一行)

val test1: (Int, Int) -> Int = { a, b
    ->
    " " // 操作一
    for (i in 0..15) { // 操作二

    }
    a + b // 操作三 : 返回值
}

Lambda高階函數(shù)

用java在實(shí)際開(kāi)發(fā)中,如遇到以下情況

A.class 中,構(gòu)造方法中一個(gè)接口作為參數(shù),需要其他類實(shí)現(xiàn).

    private final AiTest aiTest;

    public A(AiTest aiTest) {
        this.aiTest = aiTest;
    }
    
    public interface AiTest {
        int onAi();
    }

B.class 中 , b()中生成A對(duì)象,并實(shí)現(xiàn)接口,return返回值

 public void b() {
        new A(new A.AiTest() {
            @Override
            public int onAi() {
            
                int result = 66 + 99;
                return result;
                
            }
        });
    }

那么下面在kotlin用Lambda實(shí)現(xiàn)

A.class

    fun aiTest (b : () -> Int) : Int{
    
        return b.invoke()
        
    }

B.class 中

    fun b() {
    
         A().aiTest  { 66 + 99 }
         
    }

invoke()函數(shù):表示為通過(guò)函數(shù)變量調(diào)用自身,因?yàn)樯厦胬又械淖兞縝是一個(gè)匿名函數(shù)。

在A.class括號(hào)中

b : () -> Int

val test : (Int , Int) -> Int = {a , b -> a + b}

中等號(hào)前半部分一樣 ,后半部分在B.class類實(shí)現(xiàn),從而達(dá)到了接口的效果

下劃線(_)

在使用Lambda表達(dá)式的時(shí)候,可以用下劃線(_)表示未使用的參數(shù),表示不處理這個(gè)參數(shù)。

同時(shí)在遍歷一個(gè)Map集合的時(shí)候,這當(dāng)非常有用。

舉例:

val map = mapOf("key1" to "value1","key2" to "value2","key3" to "value3")

map.forEach{
     key , value -> println("$key \t $value")
}

// 不需要key的時(shí)候
map.forEach{
    _ , value -> println("$value")
}

輸出結(jié)果:
key1     value1
key2     value2
key3     value3
value1
value2
value3
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容