如何定義lambda表達式(將表達式賦值給一個常量或變量):
-
如果有小括號
如果需要參數(shù)(沒有參數(shù)可以寫()),就在小括號里寫明參數(shù)類型,參數(shù)名可以省略,然后小括號后面加上->{},
->后面如果沒有返回值就寫Unit,
-
然后在大括號{}里面寫上具體的方法實現(xiàn)
1. 在大括號{}的方法實現(xiàn)里,如果只有一個參數(shù),可以用it指定而不需要再寫x->...這種代碼,例如 val add1: (Int) -> Int = { it + 1 } 2. 如果方法實現(xiàn)里有多個參數(shù),則需要x:Int,y:Int->...這種方式指明->后面的自定義參數(shù)名,例如 val add: (Int,Int) -> Int = { x:Int,y:Int->x+y } x,y的參數(shù)類型可以不寫,因為在前面的小括號()里面定義了,所以可以寫成x,y->...這種方式,改進后 val add: (Int,Int) -> Int = { x,y->x+y } 這里有個參數(shù)順序問題,lambda表達式的參數(shù)順序,是按照大括號{}方法體里面的參數(shù)順序傳參的, 而不是按照定義函數(shù)時小括號()里的順序傳參的,如下面的代碼 val f:(x:Int, y:Int) -> Int = {y: Int, x: Int -> x - y} 如果調(diào)用f(2,1),則參數(shù)會按照大括號里的順序傳參,所以上面的y==2,x==1.而不是按照小括號里的(x:Int, y:Int)的順序傳參的
-
如果沒有小括號,可以直接寫大括號里的方法體
- 寫方法體的時候,因為前面沒有在小括號()里定義參數(shù)類型,就需要在方法體里指明參數(shù)類型,例如下面需要指明x的參數(shù)類型
val add1 = { x:Int->x + 1 }
如何定義lambda表達式(直接給方法傳參,讀者可以聯(lián)想view.setOnClickListener(new OnClickListener...)):
- 作為參數(shù)傳遞給高階函數(shù)的時候,只需要寫大括號{}方法體
因為是作為參數(shù)傳遞給高階函數(shù),而在高階函數(shù)里已經(jīng)定義了方法類型和返回值,所以大括號{}方法體里的參數(shù)類型可以省略
- 這時候不可以再寫小括號()去定義函數(shù)了,只需要寫大括號{}里的方法實現(xiàn),因為在高階函數(shù)里已經(jīng)定義好了函數(shù)的參數(shù)類型和返回值,
這就好像android用java代碼給View設(shè)置OnClickListener點擊監(jiān)聽,這時候只需要給View傳遞一個匿名類即可,例如
view.setOnClickListener(new OnClickListener(View view){...});
而不再需要
view.setOnClickListener(OnClickListener onClickListener = new OnClickListener(View view){...});
否則上面的方式會報錯
//舉個例子:
//定義高階函數(shù)
fun invoke(add:(x:Int,y:Int)->Int):Int{
return add(1,2)
}
//調(diào)用高階函數(shù)
invoke { x, y -> x+y }