Kotlin 中 infix 关键字的原理和使用场景

在 Kotlin 中,使用 infix 关键字修饰的函数称为中缀函数,使用是可以省略 .(),允许以更自然(类似自然语言)的语法调用函数,这种特性可以使代码更具可读性。

1 infix 的原理

中缀函数必须满足以下条件:

  • 必须是成员函数(成员方法)或扩展函数;
  • 有且仅有一个参数,且不能有默认值;
  • 必须显式声明 infix 关键字;

调用方法:

  • 普通函数:a.function(b);
  • 中缀函数:a function b (省略点号和括号,增强可读性);

示例:

kotlin 复制代码
class Person(private val name: String) {
    // 成员中缀函数
    infix fun say(message: String) {
        println("$name says $message")
    }
}

// 扩展中缀函数
infix fun Int.multiply(factor: Int): Int = this * factor

反编译成 Java 代码:

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;
   }
}

底层实现:

  • 中缀函数本质上是普通函数,但通过 infix 关键字允许省略 . 和括号 ()
  • 编译器在语法层面给了支持;(Kotlin 的很多特性都是在语法和编译器上的优化)

2 使用场景

2.1 自然语言风格的 API

适用于需要代码接近自然语言的场景,例如 DSL(领域特定语言)设计:

kotlin 复制代码
infix fun <T> T.shouldEqual(expected: T) {
    if (this != expected) throw AssertionError("Excepted $expected, but got $this")
}

// 使用
actualValue shouldEqual expectedValue
2.2 数学或逻辑表达式

简化数学运算符或逻辑操作的表达:

kotlin 复制代码
infix fun Int.pow(exponent: Int): Int = toDouble().pow(exponent).toInt()

val result = 2 pow 3 // 等价于 2.pow(3)
2.3 键值对构造(如 to 函数)

Kotlin 标准库中的 to 函数是典型的中缀函数:

kotlin 复制代码
val map = mapOf(
    "name" to "Eileen",
    "age" to 30
)
2.4 链式操作

结合中缀函数和扩展函数实现链式调用:

kotlin 复制代码
infix fun String.concatWith(another: String) = "$this$another"

// 链式中缀调用
val message = "Hello" concatWith "World" concatWith "!"

3 与普通函数相比

4 注意事项

  • 参数限制:中缀函数只能有一个参数,且不能有默认值;
  • 可见性:中缀函数必须是 publicinternal(默认,模块内可见);
  • 优先级:中缀函数的优先级是低于算数运算符,但高于布尔运算符;
kotlin 复制代码
1 + 2 and 3 // 等价于 (1 + 2) and 3

5 标准库中的经典案例

Kotlin 标准库广泛使用中缀函数。

5.1 to 函数

用于创建 Pair 对象:

kotlin 复制代码
infix fun <A, B> A.to(that: B): Pair<A, B> = Pair(this, that)
5.2 until 函数

生成区间:

kotlin 复制代码
val range = 1 until 10 // 等价于 1.until(10)
5.3 集合操作

例如 stepdownTo

kotlin 复制代码
for (i in 10 downTo 1 step 2) {

}
相关推荐
我的xiaodoujiao1 分钟前
Windows系统Web UI自动化测试学习系列2--环境搭建--Python-PyCharm-Selenium
开发语言·python·测试工具
callJJ4 分钟前
从 0 开始理解 Spring 的核心思想 —— IoC 和 DI(2)
java·开发语言·后端·spring·ioc·di
hsjkdhs2 小时前
万字详解C++之构造函数析构函数
开发语言·c++
安东尼肉店2 小时前
Android compose屏幕适配终极解决方案
android
Lin_Aries_04212 小时前
容器化简单的 Java 应用程序
java·linux·运维·开发语言·docker·容器·rpc
2501_916007472 小时前
HTTPS 抓包乱码怎么办?原因剖析、排查步骤与实战工具对策(HTTPS 抓包乱码、gzipbrotli、TLS 解密、iOS 抓包)
android·ios·小程序·https·uni-app·iphone·webview
techdashen3 小时前
12分钟讲解Python核心理念
开发语言·python
山海不说话3 小时前
Java后端面经(八股——Redis)
java·开发语言·redis
郝学胜-神的一滴3 小时前
谨慎地迭代函数所收到的参数 (Effective Python 第31条)
开发语言·python·程序人生·软件工程
feiyangqingyun4 小时前
基于Qt和FFmpeg的安卓监控模拟器/手机摄像头模拟成onvif和28181设备
android·qt·ffmpeg