中缀函数是kotlin中的一个特性,Java中没有,所以对于Java开发者来说比较生疏,其实它和普通函数一样,只是多了一种调用形式和一些额外的限制。
申明中缀函数很简单,只需要使用infix
关键字来修饰函数即可,中缀函数由于它调用的特殊性,所以它比普通函数多了一些限制。
在平时开发中常用到中缀函数有and、or、xor、until、shl、shr等等。中缀函数比普通函数多了一种调用形式,常规的调用方式还是可以用,比如
println(1 until 5) //1..4
println(1.until(5)) //1..4
println(1 or 0) //1
println(1.or(0)) //1
下面看一个中缀函数的使用示例,假设我们使用下面的模型来定义扑克牌,定义两个枚举类型Kind和Number,分别代表花色和数字,Card类表示牌。
enum class Kind {
HEARTS, SPADES, CLUBS, DIAMONDS
}
enum class Number {
TWO, THREE, FOUR, FIVE, SIX, SEVEN,
EIGHT, NINE, TEN, JACK, QUEEN, KING, ACE
}
data class Card(val number: Number, val kind: Kind)
比如说获取一个红桃Q实例,可以这样申明 val card = Card(Number.QUEEN, Kind.HEARTS)
,如果我们为Number类定义个普通方法。
enum class Number {
...
fun of(kind: Kind) = Card(this, kind)
}
那么这样Number.QUEEN.of(Kind.HEARTS)
就可以获取一个红桃Q的实例,如果把of方法定义为中缀函数。
enum class Number {
...
infix fun of(kind: Kind) = Card(this, kind)
}
那么这样Number.QUEEN of Kind.HEARTS
就可以获取一个红桃Q的实例,其实和普通函数一样,只是多了一种调用形式,不过这种调用形式在某些场景下会显得更加自然。