Kotlin 学习笔记 2 Kotlin 中的运算符

1、运算符和表达式

Kotlin 不支持 Java 的三目运算符,Kotlin 使用 if else 代替三目运算,Kotlin 中的运算符都是以方法形式来实现的

1.1 单目前缀运算符

运算符对应的方法
+aa.unaryPlus()
-aa.unaryMinus()
!aa.not()
var a = 10 
var b = -a
val c = a.unaryMinus()
println("b:${b},c:${c}") //b 和 c 的结果是一样的
val flag = true
val notFlag = !flag
val notFlag2 = flag.not()
println("notFlag:${notFlag},notFlag2:${notFlag2}")//  !flag() 和 flag.not() 结果也是一样的 

因此在查阅 API 发现某个类有 unaryPlus() 、 unaryMinus()、not() 方法,则该类的实例可以使用单目前缀运算符 “+、-、!” 进行运算

1.2 自加(++)自减(–)

运算符对应的方法
a++a.inc()
a–a.dec()

和 Java 同样 ++ 、 – 放在前面和后面的区别:

  • 当 ++、- - 放在变量前面时,执行过程如下:
    先对变量调用 inc() 或 dec() 方法,并将方法返回值赋给当前变量;
    自加或自减表达式返回变量的新值;
  • 当 ++ 、- - 放在变量后面时,执行过程如下:
    先用一个临时变量缓存当前变量的值;
    对变量调用 inc()、 dec() 方法, 并将方法返回值赋给变量;
    自加或自减表达式返回临时变量的值;

如果在查阅API时发现某个类有 inc() 、dec() 方法,那么说明该类可以使用 ++ 、- - 进行运算。

1.3 双目算术运算符

运算符对应的方法
a + ba.plus(b)
a - ba.minus(b)
a * ba.times(b)
a / ba.div(b)
a % ba.rem(b)
a…ba.rangeTo(b)

1.4 区间运算符

1.4.1 闭区间运算符 两个西文点符

闭区间运算符 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}")
	}
}

1.4.2 半开区间运算符 until

半开区间运算符 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]}")
}

1.4.3 反向区间 downTo

如果程序希望区间可以从大到小,则可以使用 downTo 运算符(其实是一个 infix 函数),该运算符同样构建一个闭区间。对于 a downTo b 而言, b 不能大于 a 。

1.4.4 区间步长

之前见到的所有区间的默认步长都是 1 ,也就是区间内两个值之间的差值是 1 。 我们可以通过 step 运算符(其实是一个 infix 函数)可以显示指定区间的步长。例如:

for(num in 10 downTo 0 step 2) {// 从 10 到 0 递减 步长 为 2
}

1.4.5 运算符重载

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

1.4.5.1 重载单目前缀运算符

只需要为对应的类定义名称为 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)
	}
}
1.4.5.2 重载其他的运算符

同上面一样,还可以重载:

  • 自加自减运算符 重载 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 修饰便可以对该类的实例使用 +、-、*、/、%、. . 这些运算符。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值