首页 > 代码库 > Kotlin操作符重载:把标准操作加入到任何类中(KAD 17)
Kotlin操作符重载:把标准操作加入到任何类中(KAD 17)
作者:Antonio Leiva
时间:Mar 21, 2017
原文链接:https://antonioleiva.com/operator-overload-kotlin/
就像其他每种语言一样,在Kotlin中,已经预定义了一些操作符执行一定的操作。
最典型的是加(+),减(-),乘(*),除(/),而且还有很多。
类似Java这样的一些语言,这些操作符被限制在一些特定的数量类型上,且没有方法让其他类型数据使用这些操作符。
还有在像Scala这样的其他语言中,由于函数名称可接受任何符号,我们就可创造能用于任何数据类型操作符。
Kotlin的这种方案:有一些预定义的操作符,而我们能够为任意数据类型重载它们。
Kotlin的操作符重载
如我们讨论的,Kotlin能够重载一些操作符,在我们的类中实现其相应的函数。这些函数前必须加上保留字operator
。
这些基本操作符如下:
一元操作符
+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 |
b.contains(a) |
a !in b |
!b.contains(a) |
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) |
等式(equals)操作符
a == b |
a?.equals(b) ?: b === null |
a != b |
!(a?.equals(b) ?: b === null) |
由于
equals
操作使用更复杂地转换做正确性检查,并且期望函数准确说明而不仅仅是为它的一个特殊名称,而稍有一点不同略有不同。
1 fun equals(other: Any?): Boolean
激活(invoking)函数
a(i) |
a.invoke(i) |
a(i, j) |
a.invoke(i, j) |
a(i_1, …, i_n) |
a.invoke(i_1, …, i_n) |
例子
假设你有公司数据模型,每位雇员的列表。
你可以使用get
操作符访问方括号中位置。这种实现非常容易:
1 class Employee(val id: Long, val name: String) 2 3 class Company(private val employees: List) { 4 operator fun get(pos: Int) = employees[pos] 5 }
这样你就可以使用它:
1 val company = Company(listOf(Employee(1235, "John"), Employee(2584, "Mike"))) 2 val mike = company[1]
而你也是能够超于它,并用ID来恢复值,实现这样的功能:
1 operator fun get(id: Long) = employees.first { it.id == id } 2 3 val mike = company[2584]
结论
操作符能够帮助我们为使用通用符号表达已知操作提升可读性。
小心不要在会导致读者混淆的情况下使用它们,它们能够成为一个非常有趣的工具
如果您还不知道怎样做,我建议你获取免费指南,学习怎样创建您的第一个项目,或是直接获取这本书,学习怎样从零开始创建一个完整的应用程序。
a.unaryMinus()
Kotlin操作符重载:把标准操作加入到任何类中(KAD 17)