天天看點

kotlin學習筆記——lambda表達式

Kotlin學習筆記系列:http://blog.csdn.net/column/details/16696.html

先簡單說說lambda表達式: (Type a, Type b, ...) -> {...} 左邊是參數(參數類型可省略),如果隻有一個參數括号也可以省略,右邊是函數體和傳回結果(大括号可省略)。 如:

int add(int a, int b){ 
     return a + b;
}
           

可以寫成 (a, b) -> a+b

以click為例, 在kotlin中,匿名内部類可以:

view.setOnClickListener(object: OnClickListener{
     override fun onClick(view: View){
          toast("test")
     }
})
           

通過lambda簡化為 (在kotlin中如果一個Interface包單個函數可以被替代為一個函數) view.setOnClickListener({view -> toast("test")})    //用大括号将lambda匿名函數包圍

如果左邊的參數沒有使用,也可以省略 view.setOnClickListener({ toast("test") })

如果函數的 最後一個參數是一個函數,可以放在括号後面 view.setOnClickListener() { toast("test") }

如果函數 隻有一個參數,可以省略括号 view.setOnClickListener{ toast("test") }

1、it引用 另外一種情況 當左邊的參數被使用時,且函數隻有這一個參數,如 view.setOnClickListener({ view -> toast(view.tag.toString()) }) 這時候可以用it引用來代替這個參數,可直接簡化為 view.setOnClickListener{ toast(it.tag.toString()) }

2、lambda匿名函數聲明 var obj: (Type, Type, ...) -> Type 左邊是參數類型,可以有多個但是括号不能省略。右邊是傳回類型,如果是空則是Unit。如:

setListener(var item: Item, var listener: (Item) -> Unit){
     view.setOnClickListener{ listener(item) }
}
           

注意:在這裡應該是 view. setOnClickListener{ view -> { listener(item) } },是在OnClickLisrener的OnClick函數中執行lisrener(item)的,但是由于view未使用是以可以繼續簡化成上面的樣子 使用時: setListener(item) { toast(it.name) } 注意:如果沒有參數則 var obj: () -> Type,使用時不要傳入參數,但是括号不能省略,如view.setOnClickListener{ listener() }

3、lambda函數不執行 使用匿名函數時一定要有括号,沒有括号也不會報錯,但是這個函數不會執行,如

setListener(var item: Item, var listener: (Item) -> Unit){
     view.setOnClickListener{ listener }
}
           

并不會報錯,但是點選後不執行函數, 一定要帶上括号和參數,如view.setOnClickListener{ listener(item) }

繼續閱讀