相信你已经知道在mapOf()函数里使用A to B的语法结构来构建键值对。这种语法结构的优点是可读性高,相比于调用一个函数,它更接近于使用英语的语法来编写程序。
to其实并不是Kotlin中的一个关键字,而是它提供的一种高阶语法糖特性:infix函数。其实infix函数并不是什么难理解的事物,它只是把编程语言函数调用的语法规则调整了一下而已,比如A to B的写法,实际上等价于A.to(B)的写法。
例如在String类中有一个startWith()函数
if("Hello Kotlin".startWith("Hello")) {
//处理具体的逻辑
}
startWith()函数用法虽然简单,但是我们借助infix函数,使得用一种更可读性的语法来表达这段代码。
inflix fun String.beginWith(prefix: String) = startsWith(prefix)
除去前面的infix不谈,这是一个String类的扩展函数。我们给String类添加一个beginsWith()函数,它也是用于判断一个字符串是否以某个指定参数开头的,并且它的内部实现就i是调用的String类的startsWith()函数。
但是加上了infix关键字后,beginsWith()函数就变成了一个infix函数,这样除了传统的函数调用方式之外,我们还可以用一种特殊的语法糖格式调用beginsWith()函数,如下所示:
if("Hello Kotlin" beginWith "Hello") {
//处理具体的逻辑
}
从上述的例子来看,infix函数允许我们将函数调用时的小数点,括号等计算机相关语法去掉,从而使用一种更接近英语的语法编程来编写成语。
再举个复杂一些的例子,这里有一个集合,如果想要判断集合中是否包含某个指定元素时,一般这样写:
val list = listOf("Bryant","James","Durant","Harden")
if (list.contains("Bryant")) {
//具体的处理的逻辑
}
很简单对吗?我们用infix函数修改下:
infix fun<T> Collection<T>.has(element: T) = contains(element)
val list = listOf("Bryant","James","Durant","Harden")
if(list has "Bryant"){
//具体的处理的逻辑
}
其实实际上has也只是调用了contains()函数而已,不过它更接近于使用英语的语法来编写程序,可读性更强。