• 【Kotlin】运算符函数、解构函数、中缀函数


    1 一元运算符

    1.1 符号和函数

    符号函数
    +aa.unaryPlus()
    -aa.unaryMinus()
    !aa.not()
    a++a.dec()
    a--a.inc()

    1.2 案例

    1. fun main() {
    2. var stu = Student("Tom", 13)
    3. println(-stu) // 打印: [moT, 31]
    4. }
    5. class Student(var name: String, var age: Int) {
    6. operator fun unaryMinus(): Student {
    7. return Student(name.reversed(), age.toString().reversed().toInt())
    8. }
    9. override fun toString(): String {
    10. return "[$name, $age]"
    11. }
    12. }

    2 二元运算符

    2.1 基础运算符

    2.1.1 符号和函数

    符号函数
    a + ba.plus(b)
    a - ba.minus(b)
    a * ba.times(b)
    a / ba.div(b)
    a % ba.rem(b)
    a..ba.rangeTo(b)
    a..a.rangeUntil(b)
    a in bb.contains(a)
    a !in b!b.contains(a)

    2.1.2 案例

    1. fun main() {
    2. var stu1 = Student("Tom", 13)
    3. var stu2 = Student("Mary", 18)
    4. println(stu1 + stu2) // 打印: [TomMary, 31]
    5. }
    6. class Student(var name: String, var age: Int) {
    7. operator fun plus(other: Student): Student {
    8. return Student(this.name + other.name, this.age + other.age)
    9. }
    10. override fun toString(): String {
    11. return "[$name, $age]"
    12. }
    13. }

    2.2 自增简化运算符

    2.2.1 符号和函数

    符号函数
    a += ba.plusAssign(b)
    a -= ba.minusAssign(b)
    a *= ba.timesAssign(b)
    a /= ba.divAssign(b)
    a %= ba.remAssign(b)

            说明:如果类中同时定义了 plus 和 plusAssign 运算,a += b 就会产生歧义,因为 a += b 等价于 a = a + b,编译器不知道是执行 plus 函数还是 plusAssign 函数,就会编译报错,其他运算符同理。

    2.2.2 案例

    1. fun main() {
    2. var stu1 = Student("Tom", 13)
    3. var stu2 = Student("Mary", 18)
    4. stu1 += stu2
    5. println(stu1) // 打印: [TomMary, 31]
    6. }
    7. class Student(var name: String, var age: Int) {
    8. operator fun plusAssign(other: Student): Unit {
    9. this.name += other.name
    10. this.age += other.age
    11. }
    12. override fun toString(): String {
    13. return "[$name, $age]"
    14. }
    15. }

    2.3 比较运算符

    2.3.1 符号和函数

    符号函数
    a > ba.compareTo(b)   > 0
    a < ba.compareTo(b)   < 0
    a >= ba.compareTo(b)   >= 0
    a <= ba.compareTo(b)   <= 0

    2.3.2 案例

    1. fun main() {
    2. var stu1 = Student("Tom", 13)
    3. var stu2 = Student("Mary", 18)
    4. var res = stu1 >= stu2
    5. println(res) // 打印: false
    6. }
    7. class Student(var name: String, var age: Int) {
    8. operator fun compareTo(other: Student): Int {
    9. return this.age - other.age
    10. }
    11. }

    3 括号运算符

    3.1 小括号

    3.1.1 符号和函数

    符号函数
    a()a.invoke()
    a(i)a.invoke(i)
    a(i, j)a.invoke(i, j)
    a(i_1, ..., i_n)a.invoke(i_1, ..., i_n)

    3.1.2 案例

    1. fun main() {
    2. var stu = Student("Mary", 18)
    3. stu() // 打印: Mary
    4. var age = stu(1) // 打印: a
    5. println(age) // 打印: 18
    6. }
    7. class Student(var name: String, var age: Int) {
    8. operator fun invoke(): Unit {
    9. println(name)
    10. }
    11. operator fun invoke(i: Int): Int {
    12. println(name[i])
    13. return age
    14. }
    15. }

    3.2 中括号

    3.2.1 符号和函数

    符号函数
    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] = ba.set(i, b)
    a[i, j] = ba.set(i, j, b)
    a[i_1, ..., i_n] = ba.set(i_1, ..., i_n, b)

    3.2.2 案例

    1. fun main() {
    2. var stu = Student("Mary")
    3. println(stu[1]) // 打印: a
    4. stu[1] = 'W'
    5. println(stu.name) // 打印: MWry
    6. }
    7. class Student(var name: String) {
    8. operator fun get(i: Int): Char {
    9. return name[i]
    10. }
    11. operator fun set(i: Int, c: Char): Unit {
    12. name = name.substring(0, i) + c + name.substring(i + 1)
    13. }
    14. }

    4 解构函数

    4.1 解构属性

    1. fun main() {
    2. var stu = Student("Tom", 13)
    3. var (name, age) = stu
    4. println("$name, $age") // 打印: Tom, 13
    5. var (_, age2) = stu // 只需要部分参数, 其他参数可以使用_忽略掉
    6. }
    7. class Student(var name: String, var age: Int) {
    8. operator fun component1() = name
    9. operator fun component2() = age
    10. }

    4.2 解构在 Lambda 表达式中的使用

            Lambda 表达式详细介绍见 → Lambda表达式

    1. fun main() {
    2. var stu = Student("Tom", 13)
    3. var myFun: (Student) -> Unit = {(name, age) ->
    4. println("$name, $age")
    5. }
    6. myFun(stu) // 打印: Tom, 13
    7. }
    8. class Student(var name: String, var age: Int) {
    9. operator fun component1() = name
    10. operator fun component2() = age
    11. }

    5 中缀函数

            中缀函数是使用 infix 关键字标记的函数,在使用时,可以省略点和括号,如:位运算 shl 就是一个中缀函数。函数必须满足以下条件。

    • 必须是成员函数(不是顶层函数);
    • 只能有一个参数;
    • 参数不能有默认值。

             中缀函数调用的优先级低于算术运算符、类型转换和 rangeTo 运算符,高于布尔运算符(&&、||、is)。

    1. fun main() {
    2. var stu = Student("Tom")
    3. stu play "basketball"
    4. }
    5. class Student(var name: String) {
    6. infix fun play(str: String): Unit {
    7. println("$name play $str")
    8. }
    9. fun test() {
    10. // play "badminton" // 编译报错
    11. this play "badminton"
    12. }
    13. }

            说明: 如果在类中使用中缀函数,必须明确函数的调用方(接收器)。

  • 相关阅读:
    分享一个单片机GUI库,简洁,使用
    C3P0反序列化链学习
    Python实现向量、矩阵运算(dot点积运算)
    Python与ArcGIS系列(八)通过python执行地理处理工具
    论文《Unsupervised Dialog Structure Learning》笔记:详解DD-VRNN
    Gitlab 中 Github import 功能存在远程代码执行漏洞
    Jenkins 中配置 LDAP
    深度学习开发流程
    java毕业设计公司日常考勤系统mybatis+源码+调试部署+系统+数据库+lw
    【C语言从0到1之指针】(详解,赶紧收藏期末考试备用)
  • 原文地址:https://blog.csdn.net/m0_37602827/article/details/136666747