美文网首页
每天学一点 Kotlin -- 函数:操作符

每天学一点 Kotlin -- 函数:操作符

作者: 冯可乐同学 | 来源:发表于2021-10-26 09:01 被阅读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
相关代码:https://gitee.com/fzq.com/test-demo

相关文章

网友评论

      本文标题:每天学一点 Kotlin -- 函数:操作符

      本文链接:https://www.haomeiwen.com/subject/dwetaltx.html