当前位置:   article > 正文

Kotlin操作符与重载_kotlin int compareto

kotlin int compareto

文章结构:

  • 一元操作符
    • 前缀操作符
    • 递增和递减操作符
  • 二元操作符
    • 算术运算操作符
    • 自定义重载的“+”运算符
    • in 操作符
    • 索引访问操作符
    • 调用操作符
    • 计算并赋值操作符
    • 相等与不等操作符
    • Elvis 操作符?:
    • 比较操作符
    • infix 函数,自定义中缀操作符

 

一元操作符

前缀操作符

  • 前缀+,正
  1. +a
  2. a.unaryPlus()
  • 前缀-,负
  1. -a
  2. a.unaryMinus()
  • 前缀!,取否
!isOk
  1. fun main(args: Array<String>) {
  2. var a = 7
  3. println(a) // 7
  4. println(+a) // 7
  5. println(-a) // -7
  6. println(a.unaryPlus()) // 7
  7. println(a.unaryMinus()) // -7
  8. a = -5
  9. println(a) // -5
  10. println(+a) // -5
  11. println(-a) // 5
  12. println(a.unaryPlus()) // -5
  13. println(a.unaryMinus()) // 5
  14. var isOk = true
  15. println(!isOk) // false
  16. println(isOk) // true
  17. isOk = false
  18. println(!isOk) // true
  19. println(isOk) // false
  20. }
  1. // 重载一元操作符:
  2. // 1. 声明数据类
  3. data class Point(val x:Int, val y:Int)
  4. // 2. 重载一元操作符:operator修饰符 修饰重载操作符函数
  5. // 使用关键字operator实现重载 函数unaryMinus()
  6. operator fun Point.unaryMinus() = Point(-x, -y)
  7. // 3. 测试
  8. fun test() {
  9. val p = Point(1, -5)
  10. val px = p.unaryMinus()
  11. println(p) // 输出:Point(x=1, y=-5)
  12. println(px) // 输出:Point(x=-1, y=5)
  13. println(-p) // 输出:Point(x=-1, y=5)
  14. }

递增和递减操作符

inc()dec()函数有返回值,它用于赋值给使用++--操作的变量。
前缀和后缀的表达式(++--)的返回值是不同的:

  1. fun testF() {
  2. println("a++ :")
  3. var a = 5
  4. println(a++) // 输出:5
  5. println(a) // 输出:6
  6. println(a.inc()) // 输出:7
  7. println(a) // 输出:6
  8. println("++a :")
  9. a = 5
  10. println(++a) // 输出:6
  11. println(a) // 输出:6
  12. println(a.inc()) // 输出:7
  13. println(a) // 输出:6
  14. println("a-- :")
  15. a = 5
  16. println(a--) // 输出:5
  17. println(a) // 输出:4
  18. println(a.dec()) // 输出:3
  19. println(a) // 输出:4
  20. println("--a :")
  21. a = 5
  22. println(--a) // 输出:4
  23. println(a) // 输出:4
  24. println(a.dec()) // 输出:3
  25. println(a) // 输出:4
  26. }

二元操作符

算术运算操作符

算术运算符+ - * / % ..

  1. fun testArithmeticF() {
  2. val a = 10
  3. val b = 6
  4. println(a+b) // 输出:16
  5. println(a.plus(b)) // 输出:16
  6. println(a-b) // 输出:4
  7. println(a.minus(b)) // 输出:4
  8. println(a*b) // 输出:60
  9. println(a.times(b)) // 输出:60
  10. println(a/b) // 输出:1
  11. println(a.div(b)) // 输出:1
  12. println(a%b) // 输出:4
  13. println(a.mod(b)) // 输出:4
  14. println(a.rem(b)) // 输出:4
  15. println(a..b) // 输出:10..6
  16. println(a.rangeTo(b)) // 输出:10..6
  17. println(a.downTo(b)) // 输出:10 downTo 6 step 1
  18. println(a downTo b) // 输出:10 downTo 6 step 1
  19. println(b..a) // 输出:6..10
  20. println(b.rangeTo(a)) // 输出:6..10
  21. }

自定义重载的“+”、“-”运算符

  1. // 重载加法和减法运算符:
  2. data class Counter(var c: Int) // 声明一个类
  3. operator fun Counter.plus(inc: Int) : Counter {
  4. // 重载加法运算符,实现 c加上inc
  5. return Counter(c + inc)
  6. }
  7. // 重载减法运算符,实现 c减去dec
  8. operator fun Counter.minus(dec: Int) = Counter(c - dec)
  9. fun textOverwriteF(): Unit {
  10. val count = Counter(5) // 声明一个count对象,初始化 c=5
  11. val a = count + 9 // 调用重载的加法运算符
  12. val b = count -3 // 调用重载的减法运算符
  13. println(a) // 输出:Counter(c=14)
  14. println(b) // 输出:Counter(c=2)
  15. }

in 操作符

in 操作符等价于 contains()函数。

  1. fun testIn(): Unit {
  2. val arr = arrayOf(1,2,3,4,5)
  3. val x = 3
  4. println(x in arr) // 输出:true
  5. println(x !in arr) // 输出:false
  6. println(arr.contains(x)) // 输出:true
  7. println(!arr.contains(x)) // 输出:false
  8. println(9 in arr) // 输出:false
  9. println(arr.contains(12)) // 输出:false
  10. }

索引访问操作符

索引访问操作符[] 相当于 带参数的 getset 函数:

  1. fun testIndex(): Unit {
  2. val arr = arrayOf(1,2,3)
  3. val index = 1
  4. println(arr[index]) // 输出:2
  5. println(arr.get(index)) // 输出:2
  6. arr[index] = 9
  7. println(arr[index]) // 输出:9
  8. arr.set(index, 20)
  9. println(arr[index]) // 输出:20
  10. }

调用操作符

调用操作符() 相当于 invoke()函数。

  1. // 使用表达式声明 sumF2()函数,{}表示一个Lambda表达式
  2. fun sumF2(x: Int, y: Int) = { x + y } // ⚠️ x+y 与 { x+y } 的区别
  3. fun main(args: Array<String>) {
  4. println(sumF2(5,15)) // 输出:() -> kotlin.Int,
  5. println(sumF2(5,15).invoke()) // 输出:20
  6. println(sumF2(5,15)()) // 输出:20
  7. }

计算并赋值操作符

比如 a += b ,编译器会试着生成代码 a = a+b 

  1. fun testComputeAndAssign(): Unit {
  2. var a = 10
  3. val b = 5
  4. a += b
  5. println(a) // 输出:15
  6. a -= b
  7. println(a) // 输出:10
  8. a /= b
  9. println(a) // 输出:2
  10. a *= b
  11. println(a) // 输出:10
  12. a %= b
  13. println(a) // 输出:0
  14. }

相等与不等操作符

kotlin有两种类型的相等性:

  1. 引用相等,两个引用指向同一对象,符号:“===”和“!==”

引用相等,“===”和“!==”操作符不可重载。

  1. 结构相等,使用 equals() 函数判断,符号:“==”和“!=”

Elvis 操作符?:

kotlin中Elvis 操作符特定跟null进行比较。
使用Elvis 操作符可以有效避免空指针异常。

  1. fun testElvis(): Unit {
  2. val x = null
  3. val y = x ?: 0 // 相当于: y = if (null!=x) x else 0
  4. println(y)
  5. val a = ""
  6. val b = a ?:0 // a!==null, 返回a的值
  7. println(b)
  8. }

比较操作符

kotlin中比较表达式都转换为调用 compareTo() 函数,该函数返回 Int 值。

  1. fun testCompare(): Unit {
  2. val a = 10
  3. val b = 5
  4. println(a>b) // 输出:true
  5. println(a.compareTo(b)>0) // 输出:true
  6. println(a<b) // 输出:false
  7. println(a.compareTo(b)<0) // 输出:false
  8. println(a>=b) // 输出:true
  9. println(a.compareTo(b)>=0) // 输出:true
  10. println(a<=b) // 输出:false
  11. println(a.compareTo(b)<=0) // 输出:false
  12. println(a.compareTo(5)) // 输出:1
  13. println(a.compareTo(10)) // 输出:0
  14. println(a.compareTo(15)) // 输出:-1
  15. }

infix 函数,自定义中缀操作符

重载操作符的函数需要用 operator修饰符标记,
中缀操作符函数使用 infix修饰符标记.

  1. // 自定义 Int 的中缀操作符函数
  2. infix fun Int.geek(x:Int) = (this + x)*2
  3. fun testInfixF(): Unit {
  4. val a = 5
  5. val b = a geek 1
  6. val c = a.geek(1)
  7. println(a) // 5
  8. println(b) // (5+1)*2 == 12
  9. println(c) // (5+1)*2 == 12
  10. }
  1. data class Member(val name: String, val age: Int) // 声明数据类
  2. infix fun Member.grow(years: Int) : Member { // 声明Member类的中缀操作符函数
  3. return Member(name, age+years)
  4. }
  5. fun testInfixF2(): Unit {
  6. val tyler = Member("Tyler", 20)
  7. println(tyler.grow(7)) // 输出:Member(name=Tyler, age=27)
  8. println(tyler grow 7) // 输出:Member(name=Tyler, age=27)
  9. println(tyler) // 输出:Member(name=Tyler, age=20)
  10. }
本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
  

闽ICP备14008679号