轉(zhuǎn)載請標(biāo)明出處:http://www.reibang.com/p/b0cfa50b6fde
本文出自:Jlanglang
前言:
Lambda
是一個表達(dá)式他匪,也可以說它是一個匿名函數(shù)。
lambda
是jdk1.8之后支持的特性,而kotlin
是直接支持的.其作用在我看來就是節(jié)省代碼的.
難度嘛.看兩個例子就基本懂了,android studio 3.0之后也會代碼變灰提示,自動轉(zhuǎn)換.
作用:
省掉不必要的聲明,達(dá)到節(jié)省代碼量的目的.
怎么用:
正常的java寫法:
自動轉(zhuǎn)換后:
kotlin:
java和kotlin在lambda的使用上還是有點(diǎn)區(qū)別的,區(qū)別不大
大致都是:
v(參數(shù)),v1(參數(shù))... -> v.方法()
括號使用不一樣而已.
進(jìn)入正題:
1.kotlin的Lambda的另外一種運(yùn)用:
kotlin的參數(shù)是可以直接聲明匿名函數(shù)的陵像。
變量名:(參數(shù):參數(shù)類型)->返回值
上面的代碼傳入了一個匿名沒有返回值的方法.
過程
1.fun a(function: (num: Int) -> Unit)
傳入一個匿名的沒有返回值的方法.
2.在a()中調(diào)用了(function: (num: Int) -> Unit)
匿名方法.然后傳入?yún)?shù)1
3.在b函數(shù)里面,調(diào)用了a方法.并且傳入匿名函數(shù)
{ num -> print(num) } 聲明參數(shù)num,然后打印num.
4.運(yùn)行結(jié)果: 1
java與kotlin的沖突:
如圖,在java中,調(diào)中這類方法.會要求返回Unit.INSTANCE.
是不是覺的有點(diǎn)惱火.還要去寫個返回值.
java支持自動識別接口.但是對kotlin的這種寫法就不感冒了.
解決辦法:
1.由于java自動識別接口,所以:
這里使用rxjava2的Observer做例子
open abstract class TestObserver<T>(private val c: Consumer<T>) : Observer<T> {
/**
* kotlin使用
*/
constructor(c: (t: T) -> Unit) : this(Consumer { t -> c(t) })
}
kotlin使用:
java使用:
總結(jié):
kotlin中寫lambda不會識別kotlin寫的接口.
只能轉(zhuǎn)換java的接口.(SAM轉(zhuǎn)換
)
官方的說法:Kotlin 本身已經(jīng)有了函數(shù)類型和高階函數(shù)等支持温技,所以不需要了再去轉(zhuǎn)換了茁彭。
java不會自動填充Unit返回值
可以寫兩個方法來分別對應(yīng)kotlin和java.
kotlin寫高階函數(shù)
java寫接口
當(dāng)然最好是統(tǒng)一語言.
交流群:493180098,這是個很少吹水,交流學(xué)習(xí)的群.
APP開發(fā)維護(hù)咨詢?nèi)?: 492685472 ,承接APP迭代.開發(fā)維護(hù).咨詢業(yè)務(wù),付費(fèi)快速解決問題.