Kotlin 不支持 Java 的三目运算符,Kotlin 使用 if else 代替三目运算,Kotlin 中的运算符都是以方法形式来实现的
因此在查阅 API 发现某个类有 unaryPlus() 、 unaryMinus()、not() 方法,则该类的实例可以使用单目前缀运算符 “+、-、!” 进行运算
和 Java 同样 ++ 、 – 放在前面和后面的区别:
当 ++、- - 放在变量前面时,执行过程如下: 先对变量调用 inc() 或 dec() 方法,并将方法返回值赋给当前变量; 自加或自减表达式返回变量的新值;当 ++ 、- - 放在变量后面时,执行过程如下: 先用一个临时变量缓存当前变量的值; 对变量调用 inc()、 dec() 方法, 并将方法返回值赋给变量; 自加或自减表达式返回临时变量的值;如果在查阅API时发现某个类有 inc() 、dec() 方法,那么说明该类可以使用 ++ 、- - 进行运算。
闭区间运算符 a两个点b 用于定义一个从 a ~ b(包含 a、b 边界值)的所有值的区间。对于闭区间运算符而言,a 不能 大于 b,否则运行时将会报错。 比如 for-in 循环:
fun main(args: Array<String>){ // 使用比区间运算符定义区间 var rangel = 1..5 for(num in rangel){ println("${num} * 2 = ${num * 2}") } }半开区间运算符 a until b 用于定义一个从 a~b(包含 a 边界值,但不包含 b 边界值)的所有值的区间。a 也不能大于 b。如果 a until b 中 a 与 b 的值相等,则会产生一个空区间,该区间不包含任何值;如果 a…b 中 a 与 b 的值相等则只会包含一个值。利用半开区间遍历数组等列表(索引是 0 到长度减 1)比较方便,例如:
varl lang = arrayOf("kotlin","java","python","C") for(index in 0 until lang.size){ printlin("第 ${index + 1} 种语言是:${lang[index]}") }如果程序希望区间可以从大到小,则可以使用 downTo 运算符(其实是一个 infix 函数),该运算符同样构建一个闭区间。对于 a downTo b 而言, b 不能大于 a 。
之前见到的所有区间的默认步长都是 1 ,也就是区间内两个值之间的差值是 1 。 我们可以通过 step 运算符(其实是一个 infix 函数)可以显示指定区间的步长。例如:
for(num in 10 downTo 0 step 2) {// 从 10 到 0 递减 步长 为 2 }Kotlin 的运算符都是靠特定名称的方法来支撑的,因此只要重载这些方法,我们可以为任意类添加这些运算符。重载运算符的方法需要用 operator 修饰符进行标记。
只需要为对应的类定义名称为 unaryPlus()、 unaryMinus() 、 not() ,且以 operator 修饰,程序即可对该类的实例使用 +、-、! 单目前缀运算,例如:
data class Data(val x: Int, val y: Int) { operator fun unaryMinus(): Data {// 重载 unaryMinus() 方法 加上 operator 修饰符 return Data(-x,-y)// } operator fun Data.not(): Data {// 重载 not() 方法,加上 operator 修饰符 return Data(-x,-y) } fun main(args: Array<String>){ val dt = Data(6,9) println(-dt) // 对 dt 实例 调用 单目运算 - ,输出 Data(x= -6, y= -9) println(!d) //对 dt 实例 调用单目运算 ! ,输出 Data(x = -6, y = -9) } }同上面一样,还可以重载:
自加自减运算符 重载 inc() 自加, dec() 自减 加上 operator 修饰符data class Data(val x: Int, val y: Int){ operator fun inc(): Data{ return Data(x + 1, y + 1) } } 双目算数运算: 类似的 重载 plus()、 minus()、times()、div()、rem()、rangeTo() ,且以 operator 修饰便可以对该类的实例使用 +、-、*、/、%、. . 这些运算符。