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

 更新时间:2025年05月19日 10:58:10   作者:橙子19911016  
在 Kotlin 中,使用 infix 关键字修饰的函数称为中缀函数,使用是可以省略 . 和 (),允许以更自然(类似自然语言)的语法调用函数,这种特性可以使代码更具可读性,下面给大家介绍Kotlin 中 infix 关键字的原理和使用场景,感兴趣的朋友一起看看吧

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

1 infix 的原理

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

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

调用方法:

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

示例:

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 代码:

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(领域特定语言)设计:

infix fun <T> T.shouldEqual(expected: T) {
    if (this != expected) throw AssertionError("Excepted $expected, but got $this")
}
// 使用
actualValue shouldEqual expectedValue

2.2 数学或逻辑表达式

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

infix fun Int.pow(exponent: Int): Int = toDouble().pow(exponent).toInt()
val result = 2 pow 3 // 等价于 2.pow(3)

2.3 键值对构造(如 to 函数)

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

val map = mapOf(
    "name" to "Eileen",
    "age" to 30
)

2.4 链式操作

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

infix fun String.concatWith(another: String) = "$this$another"
// 链式中缀调用
val message = "Hello" concatWith "World" concatWith "!"

3 与普通函数相比

中缀函数和普通函数

4 注意事项

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

5 标准库中的经典案例

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

5.1 to 函数

用于创建 Pair 对象:

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

5.2 until 函数

生成区间:

val range = 1 until 10 // 等价于 1.until(10)

5.3 集合操作

例如 stepdownTo

for (i in 10 downTo 1 step 2) {
}

到此这篇关于Kotlin 中 infix 关键字的原理和使用场景的文章就介绍到这了,更多相关Kotlin infix 关键字内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Android WebView如何判定网页加载的错误

    Android WebView如何判定网页加载的错误

    这篇文章主要介绍了Android WebView如何判定网页加载的错误,帮助大家更好的理解和学习使用Android,感兴趣的朋友可以了解下
    2021-04-04
  • Android DataBinding的官方双向绑定示例

    Android DataBinding的官方双向绑定示例

    本篇文章主要介绍了Android DataBinding的官方双向绑定示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-10-10
  • Android Activity之间的数据传递方法总结

    Android Activity之间的数据传递方法总结

    这篇文章主要给大家总结介绍了关于Android Activity之间的数据传递方法,文中通过示例代码介绍的非常详细,对各位Android开发者们具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-06-06
  • Android实现ImageView图片双击放大及缩小

    Android实现ImageView图片双击放大及缩小

    这篇文章主要介绍了Android实现ImageView图片双击放大及缩小的相关资料,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-02-02
  • Android中基于XMPP协议实现IM聊天程序与多人聊天室

    Android中基于XMPP协议实现IM聊天程序与多人聊天室

    这篇文章主要介绍了Android中基于XMPP协议实现IM聊天程序与多人聊天室的方法,XMPP基于XML数据格式传输,一般用于即时消息(IM)以及在线现场探测,需要的朋友可以参考下
    2016-02-02
  • 关于Android Device Monitor 无法打开问题

    关于Android Device Monitor 无法打开问题

    大家好,本篇文章主要讲的是关于Android Device Monitor 无法打开问题,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下
    2022-01-01
  • 深入分析Android加载so文件源码

    深入分析Android加载so文件源码

    这篇文章主要介绍了深入分析Android加载so文件源码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-03-03
  • Android中使用DownloadManager类来管理数据下载的教程

    Android中使用DownloadManager类来管理数据下载的教程

    这篇文章主要介绍了Android中使用DownloadManager类来管理数据下载的教程,针对HTTP下文件的下载与保存地址指定等基础操作作出了详细讲解,需要的朋友可以参考下
    2016-04-04
  • Android Koin2基本使用的那件事儿

    Android Koin2基本使用的那件事儿

    这篇文章主要给大家介绍了关于Android Koin2基本使用的那件事儿,文中通过示例代码介绍的非常详细,对各位Android开发者们具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-09-09
  • Android编程实现圆角边框的方法

    Android编程实现圆角边框的方法

    这篇文章主要介绍了Android编程实现圆角边框的方法,涉及Android针对样式布局的相关设置技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-11-11

最新评论