操作符重载
Kotin有一些固定数量象征性的操作符,我们可以在任何类中很容易地使用它们。方
法是创建一个方法,方法名为保留的操作符关键字,这样就可以让这个操作符的行
为映射到这个方法。重载这些操作符可以增加代码可读性和简洁性。
操作符表
这里你可以看见一系列包括 操作符 和 对应方法 的表。对应方法必须在指定的类中
通过各种可能性被实现。
一元操作符
操作符 | 函数 |
---|---|
+a | a.unaryPlus() |
-a | a.unaryMinus() |
!a | a.not() |
a++ | a.inc() |
a-- | a.dec() |
二元操作符
操作符 | 函数 |
---|---|
a + b | a.plus(b) |
a - b | a.minus(b) |
a * b | a.times(b) |
a / b | a.div(b) |
a % b | a.mod(b) |
a..b | a.rangeTo(b) |
a in b | a.contains(b) |
a !in b | !a.contains(b) |
a += b | a.plusAssign(b) |
a -= b | a.minusAssign(b) |
a *= b | a.timesAssign(b) |
a /= b | a.divAssign(b) |
a %= b | a.modAssign(b) |
数组操作符
操作符 | 函数 |
---|---|
a[i] | a.get(i) |
a[i, j] | a.get(i, j) |
a[i_1, ..., i_n] | a.get(i_1, ..., i_n) |
a[i] = b | a.set(i, b) |
a[i, j] = b | a.set(i, j, b) |
a[i_1, ..., i_n] = b | a.set(i_1, ..., i_n, b) |
等于操作符
操作符 | 函数 |
---|---|
a == b | a?.equals(b) ?: b === null |
a != b | !(a?.equals(b) ?: b === null) |
相等操作符有一点不同,为了达到正确合适的相等检查做了更复杂的转换,因为要
得到一个确切的函数结构比较,不仅仅是指定的名称。方法必须要如下准确地被实
现:
operator fun equals(other: Any?): Boolean
操作符 === 和 !== 用来做身份检查(它们分别是Java中的 == 和 != ),并且
它们不能被重载。
函数调用
方法 | 调用 |
---|---|
a(i) | a.invoke(i) |
a(i, j) | a.invoke(i, j) |
a(i_1, ..., i_n) | a.invoke(i_1, ..., i_n) |
例子
你可以想象,Kotlin List是实现了数组操作符的,所以我们可以像Java中的数组一
样访问List的每一项。除此之外:在可修改的List中,每一项也可以用一个简单的方
式被直接设置:
val x = myList[2]
myList[2] = 4
如果你还记得,我们有一个叫ForecastList的数据类,它是由很多其他额外的信息
组成的。有趣的是可以直接访问它的每一项而不是请求内部的list得到某一项。做一
个完全不相关的事情,我要去实现一个 size() 方法,它能稍微能简化一点当前的
Adapter:
data class ForecastList(val city: String, val country: String,valdailyForecast: List<Forecast>) {
operator fun get(position: Int): Forecast = dailyForecast[position]
fun size(): Int = dailyForecast.size
}
它会使我们的 onBindViewHolder 更简单一点:
override fun onBindViewHolder(holder: ViewHolder,position: Int) {
with(weekForecast[position]) {
holder.textView.text = "$date - $description - $high/$low"
}
}
当然还有 getItemCount() 方法:
override fun getItemCount(): Int = weekForecast.size()
扩展函数中的操作符
我们不需要去扩展我们自己的类,但是我需要去使用扩展函数扩展我们已经存在的
类来让第三方的库能提供更多的操作。几个例子,我们可以去像访问List的方式去
访问 ViewGroup 的view:
operator fun ViewGroup.get(position: Int): View = getChildAt(position)
现在真的可以非常简单地从一个 ViewGroup 中通过position得到一个view:
val container: ViewGroup = find(R.id.container)
val view = container[2]