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

4 注意事項
- 參數(shù)限制:中綴函數(shù)只能有一個參數(shù),且不能有默認值;
- 可見性:中綴函數(shù)必須是
public或internal(默認,模塊內(nèi)可見); - 優(yōu)先級:中綴函數(shù)的優(yōu)先級是低于算數(shù)運算符,但高于布爾運算符;
1 + 2 and 3 // 等價于 (1 + 2) and 3
5 標準庫中的經(jīng)典案例
Kotlin 標準庫廣泛使用中綴函數(shù)。
5.1 to 函數(shù)
用于創(chuàng)建 Pair 對象:
infix fun <A, B> A.to(that: B): Pair<A, B> = Pair(this, that)
5.2 until 函數(shù)
生成區(qū)間:
val range = 1 until 10 // 等價于 1.until(10)
5.3 集合操作
例如 step 和 downTo:
for (i in 10 downTo 1 step 2) {
}到此這篇關(guān)于Kotlin 中 infix 關(guān)鍵字的原理和使用場景的文章就介紹到這了,更多相關(guān)Kotlin infix 關(guān)鍵字內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
android:TextView簡單設(shè)置文本樣式和超鏈接的方法
這篇文章主要介紹了android:TextView簡單設(shè)置文本樣式和超鏈接的方法,涉及TextView常見文字屬性的相關(guān)操作技巧,需要的朋友可以參考下2016-08-08
Android onNewIntent()觸發(fā)機制及注意事項
這篇文章主要介紹了Android onNewIntent()觸發(fā)機制及注意事項的相關(guān)資料,需要的朋友可以參考下2016-09-09
Android編程開發(fā)實現(xiàn)帶進度條和百分比的多線程下載
這篇文章主要介紹了Android編程開發(fā)實現(xiàn)帶進度條和百分比的多線程下載,總結(jié)了前面關(guān)于Java多線程下載的技巧,實例分析了Android實現(xiàn)帶百分比和進度條的多線程下載技巧,需要的朋友可以參考下2015-12-12
android getActivity.findViewById獲取ListView 返回NULL的方法
下面小編就為大家?guī)硪黄猘ndroid getActivity.findViewById獲取ListView 返回NULL的方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-11-11
Android利用屬性動畫實現(xiàn)優(yōu)酷菜單
這篇文章主要為大家詳細介紹了Android利用屬性動畫實現(xiàn)優(yōu)酷菜單,具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-01-01

