Kotlin 中 infix 關(guān)鍵字的原理和使用場(chǎng)景解析
在 Kotlin 中,使用 infix 關(guān)鍵字修飾的函數(shù)稱為中綴函數(shù),使用是可以省略 . 和 (),允許以更自然(類似自然語(yǔ)言)的語(yǔ)法調(diào)用函數(shù),這種特性可以使代碼更具可讀性。
1 infix 的原理
中綴函數(shù)必須滿足以下條件:
- 必須是成員函數(shù)(成員方法)或擴(kuò)展函數(shù);
- 有且僅有一個(gè)參數(shù),且不能有默認(rèn)值;
- 必須顯式聲明
infix關(guān)鍵字;
調(diào)用方法:
- 普通函數(shù):
a.function(b); - 中綴函數(shù):
a function b(省略點(diǎn)號(hào)和括號(hào),增強(qiáng)可讀性);
示例:
class Person(private val name: String) {
// 成員中綴函數(shù)
infix fun say(message: String) {
println("$name says $message")
}
}
// 擴(kuò)展中綴函數(shù)
infix fun Int.multiply(factor: Int): Int = this * factor反編譯成 Java 代碼:
public final class Person {
private final String name;
public final void say(@NotNull String message) {
Intrinsics.checkNotNullParameter(message, "message");
String var2 = this.name + " say " + message;
System.out.println(var2);
}
public Person(@NotNull String name) {
Intrinsics.checkNotNullParameter(name, "name");
super();
this.name = name;
}
}底層實(shí)現(xiàn):
- 中綴函數(shù)本質(zhì)上是普通函數(shù),但通過(guò)
infix關(guān)鍵字允許省略.和括號(hào)(); - 編譯器在語(yǔ)法層面給了支持;(Kotlin 的很多特性都是在語(yǔ)法和編譯器上的優(yōu)化)
2 使用場(chǎng)景
2.1 自然語(yǔ)言風(fēng)格的 API
適用于需要代碼接近自然語(yǔ)言的場(chǎng)景,例如 DSL(領(lǐng)域特定語(yǔ)言)設(shè)計(jì):
infix fun <T> T.shouldEqual(expected: T) {
if (this != expected) throw AssertionError("Excepted $expected, but got $this")
}
// 使用
actualValue shouldEqual expectedValue2.2 數(shù)學(xué)或邏輯表達(dá)式
簡(jiǎn)化數(shù)學(xué)運(yùn)算符或邏輯操作的表達(dá):
infix fun Int.pow(exponent: Int): Int = toDouble().pow(exponent).toInt() val result = 2 pow 3 // 等價(jià)于 2.pow(3)
2.3 鍵值對(duì)構(gòu)造(如 to 函數(shù))
Kotlin 標(biāo)準(zhǔn)庫(kù)中的 to 函數(shù)是典型的中綴函數(shù):
val map = mapOf(
"name" to "Eileen",
"age" to 30
)2.4 鏈?zhǔn)讲僮?/h3>
結(jié)合中綴函數(shù)和擴(kuò)展函數(shù)實(shí)現(xiàn)鏈?zhǔn)秸{(diào)用:
infix fun String.concatWith(another: String) = "$this$another" // 鏈?zhǔn)街芯Y調(diào)用 val message = "Hello" concatWith "World" concatWith "!"
3 與普通函數(shù)相比

4 注意事項(xiàng)
- 參數(shù)限制:中綴函數(shù)只能有一個(gè)參數(shù),且不能有默認(rèn)值;
- 可見(jiàn)性:中綴函數(shù)必須是
public或internal(默認(rèn),模塊內(nèi)可見(jiàn)); - 優(yōu)先級(jí):中綴函數(shù)的優(yōu)先級(jí)是低于算數(shù)運(yùn)算符,但高于布爾運(yùn)算符;
1 + 2 and 3 // 等價(jià)于 (1 + 2) and 3
5 標(biāo)準(zhǔn)庫(kù)中的經(jīng)典案例
Kotlin 標(biāo)準(zhǔn)庫(kù)廣泛使用中綴函數(shù)。
5.1 to 函數(shù)
用于創(chuàng)建 Pair 對(duì)象:
infix fun <A, B> A.to(that: B): Pair<A, B> = Pair(this, that)
5.2 until 函數(shù)
生成區(qū)間:
val range = 1 until 10 // 等價(jià)于 1.until(10)
5.3 集合操作
例如 step 和 downTo:
for (i in 10 downTo 1 step 2) {
}到此這篇關(guān)于Kotlin 中 infix 關(guān)鍵字的原理和使用場(chǎng)景的文章就介紹到這了,更多相關(guān)Kotlin infix 關(guān)鍵字內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Android WebView如何判定網(wǎng)頁(yè)加載的錯(cuò)誤
這篇文章主要介紹了Android WebView如何判定網(wǎng)頁(yè)加載的錯(cuò)誤,幫助大家更好的理解和學(xué)習(xí)使用Android,感興趣的朋友可以了解下2021-04-04
Android Activity之間的數(shù)據(jù)傳遞方法總結(jié)
這篇文章主要給大家總結(jié)介紹了關(guān)于Android Activity之間的數(shù)據(jù)傳遞方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)各位Android開(kāi)發(fā)者們具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-06-06
Android實(shí)現(xiàn)ImageView圖片雙擊放大及縮小
這篇文章主要介紹了Android實(shí)現(xiàn)ImageView圖片雙擊放大及縮小的相關(guān)資料,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-02-02
Android中基于XMPP協(xié)議實(shí)現(xiàn)IM聊天程序與多人聊天室
這篇文章主要介紹了Android中基于XMPP協(xié)議實(shí)現(xiàn)IM聊天程序與多人聊天室的方法,XMPP基于XML數(shù)據(jù)格式傳輸,一般用于即時(shí)消息(IM)以及在線現(xiàn)場(chǎng)探測(cè),需要的朋友可以參考下2016-02-02
關(guān)于Android Device Monitor 無(wú)法打開(kāi)問(wèn)題
大家好,本篇文章主要講的是關(guān)于Android Device Monitor 無(wú)法打開(kāi)問(wèn)題,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下2022-01-01
Android中使用DownloadManager類來(lái)管理數(shù)據(jù)下載的教程
這篇文章主要介紹了Android中使用DownloadManager類來(lái)管理數(shù)據(jù)下載的教程,針對(duì)HTTP下文件的下載與保存地址指定等基礎(chǔ)操作作出了詳細(xì)講解,需要的朋友可以參考下2016-04-04

