欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

淺析Kotlin使用infix函數(shù)構(gòu)建可讀語法流程講解

 更新時(shí)間:2023年01月18日 11:00:16   作者:Mr YiRan  
這篇文章主要介紹了淺析Kotlin使用infix函數(shù)構(gòu)建可讀語法,我們?cè)贙otlin中就多次使用A to B這樣的語法結(jié)構(gòu)構(gòu)建鍵值對(duì),包括Kotlin自帶的mapOf()函數(shù),這種語法結(jié)構(gòu)的優(yōu)點(diǎn)是可讀性強(qiáng)

我們?cè)贙otlin中就多次使用A to B這樣的語法結(jié)構(gòu)構(gòu)建鍵值對(duì),包括Kotlin自帶的mapOf()函數(shù),這種語法結(jié)構(gòu)的優(yōu)點(diǎn)是可讀性強(qiáng)。那么這種功能是怎么實(shí)現(xiàn)的?to是不是Kotlin語言中的一個(gè)關(guān)鍵字?本章我們來對(duì)這個(gè)功能進(jìn)行解密。

首先,to并不是Kotlin語言中的一個(gè)關(guān)鍵字,之所以我們能使用A to B這樣的語法結(jié)構(gòu),是因?yàn)镵otlin提供了一種高級(jí)語法糖特性:infix函數(shù)。infix函數(shù)只是把編程語言函數(shù)調(diào)用的語法規(guī)則調(diào)整了一些而已,比如A to B這樣的寫法,實(shí)際上等價(jià)于A.to(B)的寫法。

通過兩個(gè)具體的例子來學(xué)習(xí)一下infix函數(shù)的用法。

String類中有一個(gè)startsWith()函數(shù),它可以用于判斷一個(gè)字符串是否以某個(gè)指定參數(shù)開頭的。比如說下面這段代碼的判斷結(jié)果一定會(huì)是true:

if("Hello Kotlin".startsWith("Hello")){
//處理具體的邏輯
}

startsWith()函數(shù)的用法雖然比較簡(jiǎn)單,但是借助infix函數(shù),我們可以使用一種更具可讀性的語法來表達(dá)這段代碼。新建一個(gè)infix.kt文件,然后編寫如下代碼:

infix fun String.beginWith(prefix:String)=startsWith(prefix)

首先,除去最前面的infix關(guān)鍵字,這是一個(gè)String類的擴(kuò)展函數(shù)。我們給String類添加一個(gè)beginsWith()函數(shù),它也是用于判斷一個(gè)字符串是否以某個(gè)指定參數(shù)開頭的,并且它的內(nèi)部實(shí)現(xiàn)就是調(diào)用的String類的startsWith()函數(shù)。

但是加上了infix關(guān)鍵字后,beginsWith()函數(shù)就變成了infix函數(shù),這樣除了傳統(tǒng)的函數(shù)調(diào)用方式之外,我們還可以用一種特殊的語法糖格式調(diào)用beginsWith()函數(shù),如下所示:

if("Hello Kotlin" beginWith "Hello"){
//處理具體邏輯
}

從這個(gè)例子就可以看出,infix函數(shù)的語法規(guī)則并不復(fù)雜,上述代碼其實(shí)就是調(diào)用的"Hello Kotlin"這個(gè)字符串的beginWith()函數(shù),并傳入了一個(gè)"Hello"字符串作為參數(shù)。但是infix函數(shù)允許我們將函數(shù)調(diào)用時(shí)的小數(shù)點(diǎn)、括號(hào)等計(jì)算機(jī)相關(guān)的語法去掉,從而使用一種更接近英語的語法來編寫程序,讓代碼看起來更加具有可讀性。

另外,infix函數(shù)由于其語法糖格式,有兩個(gè)比較嚴(yán)格的限制:

  • infix函數(shù)不能定義成頂層函數(shù)的,它必須是某個(gè)類的成員函數(shù),可以使用擴(kuò)展函數(shù)的方式將它定義到某個(gè)類當(dāng)中。
  • infix函數(shù)必須接收且只能接收一個(gè)參數(shù),至于參數(shù)類型是沒有限制的。

只有同時(shí)滿足這兩點(diǎn),infix函數(shù)的語法糖才具備使用的條件。

接下來我們?cè)倏匆粋€(gè)復(fù)雜一些的例子。比如這里有一個(gè)集合,如果你想要判斷集合中是否包含某個(gè)指定元素,一般可以這樣寫:

val list=listOf("Apple","Banana","Orange","Pear","Grape")
if(list.contains("Banana")){
//處理具體邏輯
}

但我們?nèi)匀豢梢越柚鷌nfix函數(shù)讓這段代碼變得更加具有可讀性。在infix.kt文件中添加如下代碼:

infix fun <T> Collection<T>.has(element: T)=contains(element)

可以看到我們給Collection接口添加了一個(gè)擴(kuò)展函數(shù),這是因?yàn)镃ollection是Java以及Kotlin所有集合的總接口,因此給Collection添加一個(gè)has()函數(shù),那么所有集合的子類都可以使用這個(gè)函數(shù)了。

另外,通過指定has函數(shù)的參數(shù)是泛型,所以has()函數(shù)可以接收任意具體類型的參數(shù)。而這個(gè)函數(shù)內(nèi)部的實(shí)現(xiàn)邏輯就是調(diào)用了Collection接口中的contains()函數(shù)而已。也就是說,has()函數(shù)和contains()函數(shù)的功能是一模一樣的,只是它多了一個(gè)infix關(guān)鍵字,從而擁有了infix函數(shù)的語法糖功能。

現(xiàn)在我們就可以使用如下的語法來判斷集合中是否包括某個(gè)指定的元素:

val list=listOf("Apple","Banana","Orange","Pear","Grape")
if(list has "Banana"){
//處理具體邏輯
}

還有就是mapOf()函數(shù)中允許我們使用A to B這樣的語法來構(gòu)建鍵值對(duì),它的具體實(shí)現(xiàn)是怎樣的呢?我們通過查看源碼如下:

public infix fun <A, B> A.to(that: B): Pair<A, B> = Pair(this, that)

可以看到,這里使用定義泛型的方式將to()函數(shù)定義到了A類型下,并且接收一個(gè)B類型的參數(shù)。因此A和B可以是兩種不同類型的泛型,也就使得我們可以構(gòu)建出字符串 to整型這樣的鍵值對(duì)。

再來看to()函數(shù)的具體實(shí)現(xiàn),就是創(chuàng)建并返回了一個(gè)Pair對(duì)象,也就是說,A to B這樣的語法結(jié)構(gòu)實(shí)際上得到的是一個(gè)包含A、B數(shù)據(jù)的Pair對(duì)象,而mapOf()函數(shù)實(shí)際上接收的正是一個(gè)Pair類型的可變參數(shù)列表。

我們也可以模仿to()函數(shù)的源碼來編寫一個(gè)自己的鍵值對(duì)構(gòu)建函數(shù)。在infix.kt文件中添加如下代碼:

infix fun <A,B> A.with(that:B):Pair<A,B> =Pair(this,that) 

這里只是將to()函數(shù)改名成了with()函數(shù),其他實(shí)現(xiàn)邏輯是相同的。而我們的項(xiàng)目中就可以使用with()函數(shù)來構(gòu)建鍵值對(duì)了,還可以將鍵值對(duì)傳入maoOf()方法中:

val map=mapOf("Apple" with 1,"Banana" with 2,"Orange" with 3,"Pear" with 4,"Grape" with 5)

這樣通過靈活的使用infix函數(shù),我們可以讓語法變得更具可讀性。

到此這篇關(guān)于淺析Kotlin使用infix函數(shù)構(gòu)建可讀語法流程講解的文章就介紹到這了,更多相關(guān)Kotlin infix函數(shù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Android實(shí)現(xiàn)網(wǎng)絡(luò)圖片瀏覽功能

    Android實(shí)現(xiàn)網(wǎng)絡(luò)圖片瀏覽功能

    這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)網(wǎng)絡(luò)圖片瀏覽功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • Android應(yīng)用開發(fā)中Fragment存儲(chǔ)功能的基本用法

    Android應(yīng)用開發(fā)中Fragment存儲(chǔ)功能的基本用法

    這篇文章主要介紹了Android應(yīng)用開發(fā)中使用Fragment存儲(chǔ)功能的基本用法,包括對(duì)Fragment的非中斷保存setRetaineInstance的講解,需要的朋友可以參考下
    2016-02-02
  • Android單選多選按鈕的使用方法

    Android單選多選按鈕的使用方法

    這篇文章主要為大家詳細(xì)介紹了Android單選多選按鈕的使用方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • 解決react-native軟鍵盤彈出擋住輸入框的問題

    解決react-native軟鍵盤彈出擋住輸入框的問題

    這篇文章主要介紹了解決react-native軟鍵盤彈出擋住輸入框的問題,本文通過實(shí)例圖文相結(jié)合給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-08-08
  • Android Notification的多種用法總結(jié)

    Android Notification的多種用法總結(jié)

    這篇文章主要介紹了Android Notification的多種用法總結(jié)的相關(guān)資料,需要的朋友可以參考下
    2017-06-06
  • Android WebView如何判斷是否滾動(dòng)到底部

    Android WebView如何判斷是否滾動(dòng)到底部

    大家好,本篇文章主要講的是Android WebView如何判斷是否滾動(dòng)到底部,感興趣的同學(xué)趕快來看一看吧,對(duì)你有幫助的話記得收藏一下
    2022-01-01
  • Android自定義View實(shí)現(xiàn)角度選擇器

    Android自定義View實(shí)現(xiàn)角度選擇器

    前幾天在Google Photos查看照片,用了一下它的圖片剪裁功能,于是我馬上就被其界面和操作吸引。后來想模仿做一個(gè)和Google Photos裁圖頁面幾乎一模一樣的角度選擇器,本文比較基礎(chǔ),在閱讀本文前只需要掌握最基礎(chǔ)的自定義View知識(shí)和Android事件知識(shí)。下面來一起學(xué)習(xí)下吧。
    2016-11-11
  • 淺談Android Studio JNI生成so庫

    淺談Android Studio JNI生成so庫

    下面小編就為大家?guī)硪黄獪\談Android Studio JNI生成so庫。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-04-04
  • Android軟鍵盤擋住輸入框的終極解決方案

    Android軟鍵盤擋住輸入框的終極解決方案

    最近在開發(fā)android的項(xiàng)目,在項(xiàng)目開發(fā)中遇到各種坑,今天小編就給大家分享一個(gè)關(guān)于軟鍵盤擋住輸入框的問題,下面給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,對(duì)軟鍵盤擋住輸入框的知識(shí)感興趣的朋友一起看看吧
    2016-10-10
  • Android UI系列-----ScrollView和HorizontalScrollView的詳解

    Android UI系列-----ScrollView和HorizontalScrollView的詳解

    本篇文章主要是介紹的Android UI系列-----ScrollView和HorizontalScrollView,ScrollView和HorizontalScrollView都是布局容器,有需要的可以了解一下。
    2016-11-11

最新評(píng)論