kotlin學(xué)習(xí)(三)-Lambda(高階函數(shù))以及java兼容

轉(zhuǎn)載請標(biāo)明出處:http://m.itdecent.cn/p/b0cfa50b6fde
本文出自:Jlanglang

前言:

Lambda是一個表達(dá)式,也可以說它是一個匿名函數(shù)。

lambda是jdk1.8之后支持的特性,而kotlin是直接支持的.其作用在我看來就是節(jié)省代碼的.
難度嘛.看兩個例子就基本懂了,android studio 3.0之后也會代碼變灰提示,自動轉(zhuǎn)換.

作用:

省掉不必要的聲明,達(dá)到節(jié)省代碼量的目的.

怎么用:

正常的java寫法:
image.png
自動轉(zhuǎn)換后:
image.png
kotlin:
image.png

java和kotlin在lambda的使用上還是有點區(qū)別的,區(qū)別不大

大致都是:

v(參數(shù)),v1(參數(shù))... ->   v.方法()

括號使用不一樣而已.


進(jìn)入正題:

1.kotlin的Lambda的另外一種運用:

kotlin的參數(shù)是可以直接聲明匿名函數(shù)的。

image.png
變量名:(參數(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.運行結(jié)果: 1

java與kotlin的沖突:

image.png

如圖,在java中,調(diào)中這類方法.會要求返回Unit.INSTANCE.

是不是覺的有點惱火.還要去寫個返回值.

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使用:

image.png

java使用:

image.png

總結(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ù),付費快速解決問題.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容