Kotlin infix函数用法详解

什么是 infix 函数?

infix 关键字可以让 单参数的函数更自然的语法 书写,使代码更易读。 你可以把它理解为 一种特殊的调用方式 ,不需要 .(),让代码像 自然语言 一样流畅。

要使用 infix,需要满足 三个条件

  1. 必须是成员函数或扩展函数(它必须属于某个类或某种类型)。
  2. 必须只有且只能有一个参数 (如果有多个参数,就不能用 infix)。
  3. ⭐⭐⭐⭐⭐⭐调用时可以省略 .() (但仍然可以用 . 调用)。

简单示例 1:数字比较

不使用 infix

kotlin 复制代码
fun isBigger(a: Int, b: Int): Boolean {
    return a > b
}

fun main() {
    println(isBigger(10, 5)) // 输出:true
}

这个函数 isBigger(10, 5) 可读性一般,我们可以用 infix 改写它。


使用 infix

kotlin 复制代码
infix fun Int.isBiggerThan(other: Int): Boolean {
    return this > other
}

fun main() {
    println(10 isBiggerThan 5) // 输出:true
}

10 isBiggerThan 5 读起来就像 自然语言 ,比 isBigger(10, 5) 更易懂。


简单示例 2:创建 "名字-值" 对

普通方式

kotlin 复制代码
fun pair(key: String, value: String): Pair<String, String> {
    return Pair(key, value)
}

fun main() {
    val result = pair("name", "Alice")
    println(result) // 输出: (name, Alice)
}

使用 infix

kotlin 复制代码
infix fun String.with(value: String): Pair<String, String> {
    return Pair(this, value)
}

fun main() {
    val result = "name" with "Alice"
    println(result) // 输出: (name, Alice)
}

"name" with "Alice" 读起来更像 自然语言 ,比 pair("name", "Alice") 更直观。


简单示例 3:自定义数学运算

普通加法

kotlin 复制代码
class Point(val x: Int, val y: Int) {
    fun add(other: Point): Point {
        return Point(this.x + other.x, this.y + other.y)
    }
}

fun main() {
    val p1 = Point(2, 3)
    val p2 = Point(4, 5)
    val result = p1.add(p2)

    println("(${result.x}, ${result.y})") // 输出:(6, 8)
}

使用 infix

kotlin 复制代码
class Point(val x: Int, val y: Int) {
    infix fun add(other: Point): Point {
        return Point(this.x + other.x, this.y + other.y)
    }
}

fun main() {
    val p1 = Point(2, 3)
    val p2 = Point(4, 5)
    val result = p1 add p2  // 👈 重点:不需要 `.` 和 `()` 了!

    println("(${result.x}, ${result.y})") // 输出:(6, 8)
}

p1 add p2 p1.add(p2) 更像数学公式,可读性更强。

错误示范

kotlin 复制代码
class Point(val x: Int, val y: Int) {
    infix fun Point.add(other: Point): Point { //和正确例子唯一差别就是这一行
        return Point(this.x + other.x, this.y + other.y)
    }
}

fun main() {
    val p1 = Point(2, 3)
    val p2 = Point(4, 5)
    val result = p1 add p2  // 👈 重点:不需要 . 和 () 了!

    println("(${result.x}, ${result.y})") // 输出:(6, 8)
}

不能编译 ,是因为 infix 函数不能在类内部对自身类型(Point)扩展


总结

  1. infix 让代码更像自然语言,增强可读性
  2. 只能用于
    • 类的成员函数 (如 Point 里的 add)。
    • 扩展函数 (如 String.with())。
    • 且只接受一个参数
  3. 调用时可以省略 .(),让代码更流畅。
相关推荐
小堂子这厢有礼了26 分钟前
Chet.QuartzNet.UI v2.3.0 大更新!表格重构 + 系统配置 + 分析页全面升级!
前端·后端·ui·重构·c#·vue
程序员爱钓鱼36 分钟前
Rust 控制流 if 详解:条件判断与 if 表达式
前端·后端·rust
Listen·Rain1 小时前
Vue3中computed详解
前端·javascript·vue.js
kyle~2 小时前
Swagger ---基于 描述文件 生成 交互式API文档 的工具
前端·后端·规格说明书·说明文档
世界哪有真情10 小时前
拿人类意识卡 AI?等于用 bug 验收正式产品
前端·人工智能·后端
Listen·Rain11 小时前
Vue3:setup详解
前端·javascript·vue.js
Patrick_Wilson12 小时前
修好 bug 只是开始:一次由监控需求反向重构日志结构的复盘
前端·监控·数据可视化
kyriewen12 小时前
面试官让我优化一个卡死的表格,我打开 Claude 五秒重写,他放下咖啡问我要不要来当组长
前端·javascript·面试
小粉粉hhh13 小时前
React(二)——dom、组件间通信、useEffect
前端·javascript·react.js
Csvn13 小时前
🤖 AI 生成前端代码的 5 个典型翻车现场及修复指南
前端