每天学一点 Kotlin -- 函数:操作符
2021-10-26 本文已影响0人
冯可乐同学
----《第一季Kotlin崛起:次世代Android开发 》学习笔记
总目录:每天学一点 Kotlin ---- 目录
上一篇:每天学一点 Kotlin -- 函数:参数
下一篇:每天学一点 Kotlin -- 函数:扩展
1. 函数操作符
1.1 函数的操作符用一个符号来一个函数。Kotlin 中的函数有很多内置的操作符。比如:用中括号[] 来直接访问数组中的元素、用+表示 plus 或 add 来计算数据的相加。
2. 操作符重载
2.1 使用操作符定义函数的能力被称为操作符重载。
2.2 Java 中能用的操作符函数是固定不变的。在 Kotlin 中对操作符重载做了一些限制,让操作符重载以一个可控的方式使用。有一组固定的操作符名单可以用作函数,但禁止组合使用。要创建这样的一个函数,必须用关键字 operator 来修饰并且必须有对应的英文单词做函数名。
2.3 所有操作符都有一个预定义的英文单词名以便于重载操作符。编译器直接重写操作符的用法来调用函数。 注意:操作符仅可以定义为成员函数或扩展函数。
2.4 基础操作符与相应的英文函数名
操作 函数名
!x x.not()
-y y.unaryMinus()
+z z.unaryPlus()
a..b a.rangeTo(b)
c + d c.plus(d)
e - f e.minus(f)
g * h g.times(h)
i / j i.div(j)
m % n m.mod(n)
2.5 举个栗子,对矩阵相加来声明一个重载的操作符:
class Matrix(val a: Int, val b: Int, val c: Int, val d: Int){
operator fun plus(m: Matrix): Matrix{
return Matrix(a + m.a, b + m.b, c + m.c, d + m.d)
}
}
fun testOperator(){
val m = Matrix(1, 2, 3, 4)
val n = Matrix(8, 8, 8, 8)
val mn1 = m.plus(n)
val mn2 = m + n // 操作符重载了,m.plus(n) 等价于 m +n
println("mn1 = " + mn1.a)
println("mn2 = " + mn2.a)
}
2.6 跟上面的基础操作符和相应的英文函数名一样,其他的操作符也有相应的英文函数名:
操作符 函数名
in contains
[](数组的中括号) get/set
圆括号 invoke
大于,小于,不大于,不小于 compareTo
+= plusAssgin
-= minusAssgin
*= timesAssgin
/= divAssgin
%= modAssgin
2.6.1 举个栗子1:
class Matrix(var a: Int, var b: Int, var c: Int, var d: Int) {
operator fun plus(m: Matrix): Matrix {
return Matrix(a + m.a, b + m.b, c + m.c, d + m.d)
}
operator fun get(horizontal: Int, vertical: Int): Int {
val point = Pair(horizontal, vertical)
when (point) {
Pair(0, 0) -> return a
Pair(0, 1) -> return b
Pair(1, 0) -> return c
Pair(1, 1) -> return d
else -> return 0
}
}
operator fun set(horizontal: Int, vertical: Int, value: Int) {
val point = Pair(horizontal, vertical)
when (point) {
Pair(0, 0) -> this.a = value
Pair(0, 1) -> this.b = value
Pair(1, 0) -> this.c = value
Pair(1, 1) -> this.d = value
else -> {
return
}
}
}
}
fun testOperator2() {
val m = Matrix(8, 8, 8, 8)
println("m[0, 0] = " + m[0, 0])
m[0, 1] = 10
println("m.b = " + m.b)
}
打印结果:
m[0, 0] = 8
m.b = 10
2.6.2 举个栗子2:
object MinValue {
operator fun invoke(a: Int, b: Int) = if (a > b) a else b
operator fun invoke(x: Int, y: Int, z: Int) = invoke(invoke(x, y), z)
}
fun testOperator3() {
println(MinValue(30, 20))
println(MinValue(1, 2, 3))
}
打印结果:
30
3
2.6.3 举个栗子3
class Student(val age: Int) {
operator fun compareTo(other: Student): Int {
return when {
age > other.age -> 1
age < other.age -> -1
else -> 0
}
}
}
fun testOperator4() {
val s1 = Student(15)
val s2 = Student(14)
val s3 = Student(15)
println("testOperator4 -------- 2222")
println(s1 < s2)
println(s1 <= s2)
println(s1 == s2) // 这里是在判断两个对象的地址是否相等
println(s1 > s2)
println(s1 >= s2)
println("testOperator4 -------- 3333")
println(s1 < s3)
println(s1 <= s3)
println(s1 == s3) // 这里是在判断两个对象的地址是否相等
println(s1 > s3)
println(s1 >= s3)
}
打印结果:
testOperator4 -------- 2222
false
false
false
true
true
testOperator4 -------- 3333
false
true
false
false
true