阅读完需:约 7 分钟
Kotlin 运算符重载
在Kotlin中使用operator时,将调用它的相应成员函数。 例如,表达式a + b在后台转换为a.plus(b)。
fun main(args: Array<String>) {
val a = 5
val b = 10
print(a.plus(b)) // print(a+b)
}
实际上,plus()函数被重载以处理各种Kotlin基本类型和String(字符串)。
// + 基本类型的运算符
operator fun plus(other: Byte): Int
operator fun plus(other: Short): Int
operator fun plus(other: Int): Int
operator fun plus(other: Long): Long
operator fun plus(other: Float): Float
operator fun plus(other: Double): Double
//用于字符串连接
operator fun String?.plus(other: Any?): String
您还可以通过重载相应的函数来定义运算符对对象的工作方式。 例如,您需要通过重载plus()函数来定义+运算符对对象的工作方式。
fun main(args: Array<String>) {
val p1 = Point(3, -8)
val p2 = Point(2, 9)
var sum = Point()
sum = p1 + p2
println("sum = (${sum.x}, ${sum.y})")
}
class Point(val x: Int = 0, val y: Int = 10) {
//重载 plus 函数
operator fun plus(p: Point) : Point {
return Point(x + p.x, y + p.y)
}
}
在此,plus()函数用 operator 关键字标记,以告知编译器 + 运算符正在重载。
表达式 p1 + p2 在后台转换为 p1.plus(p2)。
这是算术运算符及其相应函数的列表:
表达式 | 函数名称 | 用法 |
---|---|---|
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 = a + b | a.plusAssign(b) |
a-= b | a = a-b | a.minusAssign(b) |
a * = b | a = a * b | a.timesAssign(b) |
a / = b | a = a / b | a.divAssign(b) |
a%= b | a = a%b | a.modAssign(b) |
fun main(args: Array<String>) {
var number = 12
number *= 5 // number = number*5
println("number = $number")
}
一元前缀 和 递增/递减运算符
这是一元运算符,它们的含义和相应功能的表:
运算符 | 描述 | 表达式 | 用法 |
---|---|---|---|
+ | 一元加 | +a | a.unaryPlus() |
– | 一元减 | -a | a.unaryMinus() |
! | 不是(反转值) | !a | a.not() |
++ | 递增:值加1 | ++a | a.inc() |
— | 递减:值减1 | –a |
a.dec() |
fun main(args: Array<String>) {
val a = 1
val b = true
var c = 1
var result: Int
var booleanResult: Boolean
result = -a
println("-a = $result")
booleanResult = !b
println("!b = $booleanResult")
--c
println("--c = $c")
}
返回:
-a = -1
!b = false
--c = 0
比较运算符 和 相等运算符
这是一个相等和比较运算符,它们的含义以及相应函数的列表:
运算符 | 描述 | 表达式 | 用法 |
---|---|---|---|
> | 大于 | a> b | a.compareTo(b)> 0 |
< | 小于 | a <b | a.compareTo(b)<0 |
> = | 大于 或 等于 | a> = b | a.compareTo(b)>= 0 |
<= | 小于 或 等于 | a <= b | a.compareTo(b)<= 0 |
== | 等于 | a == b | a?.equals(b)?:(b === null) |
!= | 不等于 | a!= b | !(a?.equals(b)?:(b ===null)) |
比较和相等运算符用于控制流,例如:if 表达式,when表达式 和 循环。
fun main(args: Array<String>) {
val a = -12
val b = 12
//使用大于运算符
val max = if (a > b) {
println("a大于b")
a
} else {
println("b大于a")
b
}
println("max = $max")
}
逻辑运算符
Kotlin中有两个逻辑运算符:|| 和 &&
这是逻辑运算符,它们的含义和相应函数的表。
运算符 | 描述 | 表达式 | 对应函数 |
---|---|---|---|
|| | 如果任一布尔表达式为true,则为true |
(a>b)||(a<c) | (a>b)or(a<c) |
&& | 如果所有布尔表达式均为true,则为true | (a>b)&&(a<c) | (a>b)and(a<c) |
请注意,or 和 and 是支持中缀表示法的函数。
逻辑运算符用于控制流,例如 if表达式,when表达式 和 循环。
fun main(args: Array<String>) {
val a = 10
val b = 9
val c = -1
val result: Boolean
// result 为 true 是最大
result = (a>b) && (a>c) // result = (a>b) and (a>c)
println(result)
}
in 运算符
in运算符用于检查一个对象是否属于一个集合。
运算符 | 表达式 | 用法 |
---|---|---|
in |
a in b | b.contains(a) |
!in |
a !in b |
!b.contains(a) |
fun main(args: Array<String>) {
val numbers = intArrayOf(1, 4, 42, -3)
if (4 in numbers) {
println("numbers 数组包含 4.")
}
}
索引访问运算符
以下是在Kotlin中使用带有相应函数的索引访问运算符的一些表达式。
表达 | 用法 |
---|---|
a[i] | a.get(i) |
a[i, n] | a.get(i, n) |
a[i1, i2, …, in] | a.get(i1, i2, …, in) |
a[i] = b | a.set(i, b) |
a[i, n] = b | a.set(i, n, b) |
a[i1, i2, …, in] = b | a.set(i1, i2, …, in, b) |
fun main(args: Array<String>) {
val a = intArrayOf(1, 2, 3, 4, - 1)
println(a[1])
a[1]= 12
println(a[1])
}
invoke 运算符
以下是Kotlin中使用带有相应函数的invoke运算符的一些表达式。
表达 | 翻译成 |
---|---|
a() | a.invoke() |
a(i) | a.invoke(i) |
a(i1, i2, …, in) | a.inkove(i1, i2, …, in) |
a[i] = b | a.set(i, b) |
在Kotlin中,括号被转换为调用invoke成员函数。
按位运算
与Java不同,Kotlin中没有按位和移位运算符。为了执行这些任务,使用了各种功能(支持中缀符号):
- shl – 签名左移
- shr – 右移签名
- ushr – 无符号右移
- and – 按位与
- or – 按位或
- xor – 按位异或
- inv – 按位反
中缀函数(infix)
在学习如何创建具有中缀符号的函数之前,让我们先研究两个常用的中缀函数。
使用 || 和 &&& 操作时,编译器分别查找 or 和 and 函数,并在后台调用它们。这两个函数支持中缀表示法。
fun main(args: Array<String>) {
val a = true
val b = false
var result: Boolean
result = a or b // a.or(b)
println("result = $result")
result = a and b // a.and(b)
println("result = $result")
}
运行该程序时,输出为:
result = true
result = false
在上面的程序中,使用a or b 代替 a.or(b),并使用 a and b 代替 a.and(b)。 这是允许的,因为这两个函数支持中缀表示法。
如何创建带有中缀符号的函数?
您可以使用中缀表示法在Kotlin中进行函数调用,如果函数
- 是成员函数(或扩展函数)。
- 只有一个参数。
- 标有 infix 关键字。
class Structure() {
infix fun createPyramid(rows: Int) {
var k = 0
for (i in 1..rows) {
k = 0
for (space in 1..rows-i) {
print(" ")
}
while (k != 2*i-1) {
print("* ")
++k
}
println()
}
}
}
fun main(args: Array<String>) {
val p = Structure()
p createPyramid 4 // p.createPyramid(4)
}
运行该程序时,输出为:
*
* * *
* * * * *
* * * * * * *
例子二:
infix fun String.rotate(count: Int): String {
val index = count % length
return this.substring(index) + this.substring(0, index)
}
println("HelloWorld" rotate 5)