重载算术运算发
- 重载运算符需要使用关键字: operator , 表明该函数作为相应的约定来实现;
- Kotlin限制了可以重载的运算符
注意:- 不要求两个运算数的类型相同;
- 不会自动支持交换性(1.5 * p & p *1.5),由于两个运算数的类型不同,需要在相应的类型中做相应的重载处理(扩展函数…)
- 返回类型可以不同于任一运算符类型
- 重载复合赋值运算符
返回值为Unit,名为plusAssign(minusAssign, timesAssign)的函数,需要用operator关键字修饰,Kotlin将会在用到+=(-=, *=)运算符的地方调用对应的函数;
可变集合的plusAssign函数
注意:不能同时定义plus, plusAssign函数,会报错;
Kotlin标准库支持集合的两个方法:+ , - , += , -=
- 重载一元运算符
不需要传参数
重载比较运算符
由于operator修饰符被用在基类的接口中,因此重写该接口无需再重复
- 可以对任意的对象使用比较运算符(==, != , > , <),不需要调用equals或compareTo
- 等号运算符 == 与 != 可以用于可空运算符
注意:!=会被转换成==的取反操作;
===恒等运算符检查是否是同一个对象 - 排序运算发
Kotlin支持相同的Comparable接口,比较运算符(< , > , <= , >=)的使用将会被转换成compareTo
使用compareValuesBy()函数来简洁的实现compareTo方法,按顺序依次调用回调方法,两两一组做比较,并返回结果
集合和区间之间的约定
- 通过使用下标来访问元素: get , set
a[index] 称为下标运算符;读取元素会被转换成get方法,写入元素会调用set方法
自定义类添加下标索引:定义一个名为get函数或者set函数,并标记为operator,参数类型可以是任意类型(数组的是Int, map的是键的类型…)
- in的约定
in运算符:检查某个对象是否属于集合 , 相对应的函数叫contains
重载:operator fun contains(args…) : Boolean{…}
注意: until 开区间,不包括最后一个元素;符号… 闭区间,包含最后一个元素 - rangeTo的约定
创建区间:…
rangeTo是Comparable的一个扩展函数 ,其优先级低于算术运算符,调用方法需要用括号括起来 - 在for循环中使用“iterator"的约定
使用for(x in list){…}会被转换成list.iterator(),然后重复调用hasNext, next方法
标准库已经为CharSequence定义了扩展函数iterator,所以可以遍历字符串
解构声明与组件函数
对于数据类,编译器为每个在主构造方法中声明的属性生成componentN函数
委托属性
- 委托:一种设计模式:操作的对象不用自己执行,而是把工作委托给另一个辅助的对象,辅助对象称为委托;
- 委托属性的基本操作:
关键字by可以用于任何符合属性委托约定规则的对象
工作原理:
按照约定:Delegate类必须具有getValue和setValue方法 (后者属于可变属性)
- 惰性初始化:by lazy()
支持属性技术:
- 变换规则
- 使用委托属性把值存到map中
原因:标准map和mutableMap接口已经定义了getValue, setValue扩展函数