美文网首页
每天学一点 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