1.Lambda表達式
(1) lambda表達式一定在一個大花括號中生存
(2) 參數(shù)在->之前玷犹,表達式在->之后(參數(shù)類型可以省略)
如:c->fun(v) 參數(shù)->表達式
具體的寫法可以有以下兩種寫法:
//1.val sum1={ x:Int,j:Int->x+j;}
//2.val sum2:(x:Int,j:Int)->Int={
a,b->a+b
}
2.lambda 表達式靈活使用
沒有使用Lambda前
View view = findViewById(R.id.textView);
view.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
viewClicked(view);
}
});
使用了Lambda之后
View view = findViewById(R.id.textView);
view.setOnClickListener{
//大括號體內才是正真的lambda表達式
view->viewClicked(view)
}
如果沒有接觸過Lambdab咋看一眼估計都是這個表情
讓我們來剖析一下view.setOnClickListener { v -> imageClicked(v) }這個表達式是如何一步一步演化而來的辅愿。
(1)讓我們先寫一個完整的lambda表達式
val imageClick:(v:View)->Unit={
v->viewClicked(v)
}
申明一個函數(shù)變量 imageClick,并指向一個Lambda函數(shù){v->viewClicked(v)}
然后在Lambda表達式中調用viewClicked(v:View?)方法
然后調用此方法
lambda表達式可以傳遞給一個高階函數(shù)當作參數(shù)
view.setOnClickListener(imageClick)
就立馬可以演變成為
view.setOnClickListener({
v->viewClick(v)
})
并且Kolin中有一個規(guī)定妓羊,如果函數(shù)表達式的最后一個參數(shù)是一個函數(shù)嘲驾,并且傳遞的是一個lambda表達式來作為參數(shù)
那么lambda表達式可以提取到圓括號外面写半。
view.setOnClickListener(){
v->viewClick(v)
}
同時還規(guī)定如果一個函數(shù)的參數(shù)只有一個屿衅,且參數(shù)也是一個函數(shù),那么可以省略最左側的圓括號:
所以就有了
view.setOnClickListener{
v->viewClick(v)
}
這樣子的精妙寫法擅腰。
3.why use Lambda
然后我們可以思考一下java已經(jīng)有匿名內部類了為什么我們還要學Lambda來實現(xiàn)呢蟋恬?
通過之前的例子,我們已經(jīng)可以很好地看出來使用Lambda表達式可以一方面簡化我們的代碼邏輯趁冈,尤其是匿名內部類的"回調地獄嵌套"
最重要的一點就是Lambda表達式可以避免在抽象類或者接口中編寫明確的函數(shù)式聲明歼争。同時也避免了類的實現(xiàn)部分,省去了OnClickListener接口這一環(huán)節(jié)
tips:Lambda大法雖好渗勘,但是也不是任何地方都能夠使用哦沐绒!
使用Lambda表達式的前提就是此接口必須只有一個抽象方法需要實現(xiàn),多余一個抽象方法時不能使用Lambda表達式。所以Lambda大法雖好旺坠,可也要選擇性使用哦乔遮!