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) }