当前位置: 首页 > news >正文

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

1 一元运算符

1.1 符号和函数

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

1.2 案例

fun main() {var stu = Student("Tom", 13)println(-stu) // 打印: [moT, 31]
}class Student(var name: String, var age: Int) {operator fun unaryMinus(): Student {return Student(name.reversed(), age.toString().reversed().toInt())}override fun toString(): String {return "[$name, $age]"}
}

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..<ba.rangeUntil(b)
a in bb.contains(a)
a !in b!b.contains(a)

2.1.2 案例

fun main() {var stu1 = Student("Tom", 13)var stu2 = Student("Mary", 18)println(stu1 + stu2) // 打印: [TomMary, 31]
}class Student(var name: String, var age: Int) {operator fun plus(other: Student): Student {return Student(this.name + other.name, this.age + other.age)}override fun toString(): String {return "[$name, $age]"}
}

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 案例

fun main() {var stu1 = Student("Tom", 13)var stu2 = Student("Mary", 18)stu1 += stu2println(stu1) // 打印: [TomMary, 31]
}class Student(var name: String, var age: Int) {operator fun plusAssign(other: Student): Unit {this.name += other.namethis.age += other.age}override fun toString(): String {return "[$name, $age]"}
}

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 案例

fun main() {var stu1 = Student("Tom", 13)var stu2 = Student("Mary", 18)var res = stu1 >= stu2println(res) // 打印: false
}class Student(var name: String, var age: Int) {operator fun compareTo(other: Student): Int {return this.age - other.age}
}

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 案例

fun main() {var stu = Student("Mary", 18)stu() // 打印: Maryvar age = stu(1) // 打印: aprintln(age) // 打印: 18
}class Student(var name: String, var age: Int) {operator fun invoke(): Unit {println(name)}operator fun invoke(i: Int): Int {println(name[i])return age}
}

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 案例

fun main() {var stu = Student("Mary")println(stu[1]) // 打印: astu[1] = 'W'println(stu.name) // 打印: MWry
}class Student(var name: String) {operator fun get(i: Int): Char {return name[i]}operator fun set(i: Int, c: Char): Unit {name = name.substring(0, i) + c + name.substring(i + 1)}
}

4 解构函数

4.1 解构属性

fun main() {var stu = Student("Tom", 13)var (name, age) = stuprintln("$name, $age") // 打印: Tom, 13var (_, age2) = stu // 只需要部分参数, 其他参数可以使用_忽略掉
}class Student(var name: String, var age: Int) {operator fun component1() = nameoperator fun component2() = age
}

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

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

fun main() {var stu = Student("Tom", 13)var myFun: (Student) -> Unit = {(name, age) ->println("$name, $age")}myFun(stu) // 打印: Tom, 13
}class Student(var name: String, var age: Int) {operator fun component1() = nameoperator fun component2() = age
}

5 中缀函数

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

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

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

fun main() {var stu = Student("Tom")stu play "basketball"
}class Student(var name: String) {infix fun play(str: String): Unit {println("$name play $str")}fun test() {// play "badminton" // 编译报错this play "badminton"}
}

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

http://www.lryc.cn/news/317712.html

相关文章:

  • springboot268码头船只货柜管理系统
  • Java面试题11MySQL之执行计划到事务及慢查询
  • 算法时空复杂度分析:大O表示法
  • threejs简单创建一个几何体(一)
  • msfconsole数据库连接不了的问题【已解决】
  • 7. Linux进程环境
  • [linux] 静态图和动态图
  • 1.Spring核心功能梳理
  • 活动预告:如何培养高质量应用型医学人才?
  • 蓝桥杯算法错题记录-基础篇
  • Java知识点之单例模式
  • Flutter第三弹:常用的Widget
  • Dynamic Wallpaper v17.4 mac版 动态视频壁纸 兼容 M1/M2
  • Windows / Mac应用程序在Linux系统中的兼容性问题 解决方案
  • Net Core 使用Mongodb操作文件(上传,下载)
  • 适用于系统版本:CentOS 6/7/8的基线安全检测脚本
  • Seata源码流程图
  • 英飞凌电源管理PMIC的安全应用
  • 快速在Linux系统安装MySQL
  • 数据库相关理论知识(有目录便于直接锁定相关知识点+期末复习)
  • NCC环境配置
  • 用python实现Dubins曲线生成
  • 智能技术上的“是”并不代表具体领域的“应该”
  • 永热爱 敢向前 | Paraverse平行云的2023 年终总结
  • c/c++的内存分配,详细说一下栈、堆和静态存储区
  • 每日构造题训练——C. Divan and bitwise operations
  • 【C++练级之路】【Lv.13】多态(你真的了解虚函数和虚函数表吗?)
  • 如何在Windows系统安装Node.js环境并制作html页面发布公网远程访问?
  • C#,数值计算,希尔伯特矩阵(Hilbert Matrix)的算法与源代码
  • 【C++教程从0到1入门编程】第八篇:STL中string类的模拟实现