人民广场语言学习——kotlin

Kotlin——运算符和表达式

2021-04-25  本文已影响0人  So_ProbuING

与Java相同的运算符

Kotlin完全支持Java的运算符

Kotlin的运算符都是以方法形式来实现的,这些运算符都具有特定的符号和固定的优先级,各种运算符对应的方法名都是固定的,我们只要为某类型提供了特定名称的方法,成员方法或扩展方法。接下来即可对该类型的对象使用“+”进行运算,因此,Kotlin的所有运算符的功能都是广义的,不仅能作用于数值型、字符串,也可以作用于任意自定义的Kotlin类

单目前缀运算符

单目前缀运算符有:+(一元加)、-(一元减)、!(非)

运算符 对应的方法
+a a.unaryPlus()
-a a.unaryMinus()
!a a.not()
   var a : Int = 20;
    //使用运算符
    val b = -a
    //调用运算符方法
    val c = a.unaryPlus();
    println("b的值${b}c的值${c}")
    val flag = true
    val notFlag = !flag
    println("flag !${notFlag}")

自加和自减运算符

运算符 对应的方法
a++ a.inc()
a-- a.dec()
  1. 先对变量调用inc()、dec()方法,并将方法返回值赋给变量
  2. 自加或自减表达式返回变量的新值

当++、--放在变量后面是,执行过程:

  1. 先用一个临时变量缓存变量的值
  2. 对变量调用inc()、dec()方法,并将方法返回值赋给变量
  3. 自加或自减表达式返回临时变量的值
  var a = 20;
    a++
    print(a); //21
    //调用方法
    a = a.inc() //22
    print(a)

双目运算符

运算符 对应的方法
a+b a.plus(b)
a-b a.minus(b)
a*b a.times(b)
a/b a.div(b)
a%b a.rem(b)
a..b a.rangeTo(b)
   var a = 5
    var b = 6
    //+
    println(a+b)
    println(a.plus(b))
    //-
    println(a-b)
    println(a.minus(b))
    //*
    println(a*b)
    println(a.times(b))
    ///
    println(a/b)
    println(a.div(b))
    //%
    println(a%b)
    println(a.rem(b))
    //..
    println(a..b)
    println(a.rangeTo(b))

in和!in运算符

a in b 判断b中是否包含a

运算符 对应的方法
a in b b.contains(a)
a !in b !b.minus(s)
   var s = "hello world"
    var si = "hello"
    println(si in s)
    println(s.contains(si))

索引访问运算符

运算符 对应的方法
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]=b a.set(i,b)
a[i,j]=b a.set(i,j,b)
  var s = "testIndexOperation"
    //get
    println(s.get(3))
    println(s[3])
    //java List
    var list = ArrayList<String>()
    list.add("add1")
    list.add("add2")
    list.add("add3")
    list.add("add4")
    //使用索引运算符
    println(list[3])
    //使用get函数
    println(list.get(3))

调用运算符

运算符 对应方法
a() a.invoke()
a(b) a.invoke(b)
a(b1,b2) a.invoke(b1,b2)
a(b1,b2,b3...) a.invoke(b1,b2,b3,...)

广义赋值运算符

运算符 对应的方法
a+=b a.plusAssign(b)
a-=b a.minusAssign(b)
a*=b a.timeAssign(b)
a/=b a.divAssign(b)
a%=b a.remAssign(b)

对于广义赋值操作,例如 a+=b,编译器会先判断plusAssign()方法是否存在,如果存在则按照如下步骤执行

  1. 如果plus()方法也存在,则会报错
  2. 确保plusAssign()没有返回值
  3. 如果满足 1、2两步的检查,那么转换为执行a.plusAssign(b),如果plusAssign()方法不存在,那么a+=b 将转换为 a=a+b

相等于不相等运算符

运算符 对应的方法
a==b a?.equals(b)?:(b===null)
a!=b !(a?.equals(b)?:(b===null))

Kotlin的“==”不再比较两个变量是否引用同一个对象,实际上“==”与equals()比较基本是等义的,只不过==比较是空指针安全的

而在Kotlin中 判断两个变量是否指向同一个对象 要使用 ===

比较运算符

运算符 对应的方法
a>b a.compareTo(b)>0
a<b a.compareTo(b)<0
a>=b a.compareTo(b)>=0
a<=b a.compareTo(b)<=0

区间运算符

闭区间运算符

闭区间运算符a..b用于顶一个一个从a~b(包括a、b边界值)的所有值的区间,对于闭区间运算符而言 a不能大于b

半开区间运算符

半开区间运算符 a until b 用于定义一个从a~b(包括a边界,不包括b)的所有值的区间。同样也是a不能大于b

反向区间

如果希望区间可以从大到小,则可以使用downTo运算符,该运算符同样构建一个闭区间。此时要求b不能大于a

区间步长

我们可以通过step运算符,可以显式指定区间的步长

for (num in 7 downTo 1 step 2){
        println("${num}")
    }

运算符装载

Kotlin的运算符都是靠特定名称的方法支撑的,因此只要重载这些名称的方法,我们就可以为任意类添加运算符
重载运算符的方法需要使用operator修饰符进行标记

重在单目前缀运算符

只要为任意类定义名为unaryPlus()、unaryMinus()、not() 且以operator修饰的方法,程序即可对该类的实例使用+、-、!单目前缀运算符

上一篇下一篇

猜你喜欢

热点阅读