1盾碗、標(biāo)準(zhǔn)的lambda表達(dá)式要滿足三個(gè)條件
① 含有實(shí)際參數(shù)
② 含有函數(shù)體
③ 以上的內(nèi)容都要包含在花括號(hào)內(nèi)
當(dāng)然這種形式媚污,在開發(fā)中見到的很少,因?yàn)楹芏鄷r(shí)候都進(jìn)一步簡(jiǎn)化了廷雅。
2耗美、正題:kotlin中點(diǎn)擊方法可以寫的很簡(jiǎn)單,以android view的點(diǎn)擊事件為例航缀,像醬紫:
View.setOnClickListener {
}
相對(duì)于java的可謂是簡(jiǎn)單多了商架,java的:
view.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
}
});
雖然java8開始引入lambda了,但是還是比kotlin復(fù)雜:
view.setOnClickListener(v -> {
});
kotlin大法好芥玉,那么究竟是怎么一步一步的簡(jiǎn)化到一行代碼的呢蛇摸?中間究竟發(fā)生了什么,讓我們一步一步來
/**
* 原始的寫法
*/
bt_lambda.setOnClickListener(object : View.OnClickListener {
override fun onClick(v: View ) {
Logger.d("按鈕被點(diǎn)擊了")
Logger.d(v.id)
}
})
/**
* 可以看到setOnClickListener方法傳入了一個(gè) 匿名內(nèi)部類
* kotlin規(guī)定灿巧,如果對(duì)象是單個(gè)Java(必須是java8习馈!抠藕!如果類似 test2方法的kotlin接口饿肺,不行!6芩啤敬辣!)抽象方法的接口,那么可以用帶有
* 接口類型的前綴的lambda表達(dá)式來表示
* OnClickListener接口,參數(shù)為View溉跃,因此可以變成如下寫法
*/
bt_lambda.setOnClickListener(View.OnClickListener { v: View ->
Logger.d("按鈕被點(diǎn)擊了")
Logger.d(v.id)
})
/**
*因?yàn)閟etOnClickListener 是java代碼 View中的方法村刨,所以接口類型的前綴可以省略
* 變成下面這樣,test2方法中可以看到set方法在kotlin和java中的區(qū)別
*/
bt_lambda.setOnClickListener({ v: View ->
Logger.d("按鈕被點(diǎn)擊了")
Logger.d(v.id)
})
/**
* kotlin語法約定撰茎,如果lambda表達(dá)式是函數(shù)是最后一個(gè)實(shí)參的話嵌牺,它可以放在
* 括號(hào)外面
* @see com.xu.module.jianshu.ui.retrofit.Retrofit.create 參考這個(gè)方法動(dòng)態(tài)代理的kotlin寫法
*/
bt_lambda.setOnClickListener() { v: View ->
Logger.d("按鈕被點(diǎn)擊了")
Logger.d(v.id)
}
/**
* kotlin規(guī)定,如果lambda是函數(shù)的唯一實(shí)參的時(shí)候
* 小括號(hào)可以直接省略乾吻,因此變成這樣
*/
bt_lambda.setOnClickListener { v: View ->
Logger.d("按鈕被點(diǎn)擊了")
Logger.d(v.id)
}
/**
* 因?yàn)閗otlin中可以推導(dǎo)出參數(shù)的類型髓梅,因此可以進(jìn)一步簡(jiǎn)化
*/
bt_lambda.setOnClickListener { v ->
Logger.d("按鈕被點(diǎn)擊了")
Logger.d(v.id)
}
/**
* 因?yàn)橹挥幸粋€(gè)參數(shù),可以用默認(rèn)的參數(shù)t來代替绎签,因此演變成如下
*/
bt_lambda.setOnClickListener {
Logger.d("按鈕被點(diǎn)擊了")
Logger.d(it.id)
}
基本就是這樣枯饿,如果想了解,那些不能省略诡必。奢方。可以看一下我寫的demo爸舒,撒花