我们在声明一个map的时候通常可以用下面的代码:
val map = mapOf(1 to "one", 2 to "two", 3 to "three")
上面这段代码一看有个地方很奇怪,就是这个to是什么?在Java中没有见过这种写法。
看下mapOf的源码:
public fun <K, V> mapOf(vararg pairs: Pair<K, V>): Map<K, V> = if (pairs.size > 0) linkedMapOf(*pairs) else emptyMap()
从上面的源码可以看到mapOf需要一个可变参数,类型是Pair。我们再按住Ctrl键,点击to关键字,看下to的源码定义。如下:
/**
* Creates a tuple of type [Pair] from this and [that].
*
* This can be useful for creating [Map] literals with less noise, for example:
* @sample samples.collections.Maps.Instantiation.mapFromPairs
*/
public infix fun <A, B> A.to(that: B): Pair<A, B> = Pair(this, that)
发现to其实也是个方法,不过方法前面加了个关键字infix。这就是我们所要说的infix函数。
infix函数需要几个条件:
- 只有一个参数
- 在方法前必须加infix关键字
- 必须是成员方法或者扩展方法
举例
我们在InfixTest.kt文件中加入如下代码:
infix fun Int.add(x: Int): Int {
return this + x
}
调用这个infix函数,并打印
println(100 add 200)
输出结果:
I/System.out: 300
上面这个列子是扩展函数实现的情况,下面举一个成员函数的例子:
我们定义一个Account类:
class Account {
var balance = 100.0
infix fun add(amount: Double) : Unit {
this.balance = balance + amount
}
}
上面的代码可以看到有个infix函数
调用并打印:
val account = Account()
account add 100.00
print(account.balance)
输出的结果是200.00
总结:
这篇文章就是给大家演示了下infix函数,它没有给Kotlin带来新的什么特性,不想扩展函数,但是infix函数,增加了可读性,让我们的代码更易读懂。