第七章:运算符重载及其他约定

重载算术运算发

  1. 重载运算符需要使用关键字: operator , 表明该函数作为相应的约定来实现;
  2. Kotlin限制了可以重载的运算符
    第七章:运算符重载及其他约定_第1张图片
    注意:
    • 不要求两个运算数的类型相同;
    • 不会自动支持交换性(1.5 * p & p *1.5),由于两个运算数的类型不同,需要在相应的类型中做相应的重载处理(扩展函数…)
    • 返回类型可以不同于任一运算符类型
  3. 重载复合赋值运算符
    返回值为Unit,名为plusAssign(minusAssign, timesAssign)的函数,需要用operator关键字修饰,Kotlin将会在用到+=(-=, *=)运算符的地方调用对应的函数;
    可变集合的plusAssign函数
    在这里插入图片描述
    注意:不能同时定义plus, plusAssign函数,会报错;
    第七章:运算符重载及其他约定_第2张图片
    Kotlin标准库支持集合的两个方法:+ , - , += , -=
    第七章:运算符重载及其他约定_第3张图片
  4. 重载一元运算符
    不需要传参数
    第七章:运算符重载及其他约定_第4张图片

重载比较运算符

由于operator修饰符被用在基类的接口中,因此重写该接口无需再重复

  1. 可以对任意的对象使用比较运算符(==, != , > , <),不需要调用equals或compareTo
  2. 等号运算符 == 与 != 可以用于可空运算符
    注意:!=会被转换成==的取反操作;
    在这里插入图片描述
    ===恒等运算符检查是否是同一个对象
  3. 排序运算发
    Kotlin支持相同的Comparable接口,比较运算符(< , > , <= , >=)的使用将会被转换成compareTo
    在这里插入图片描述
    使用compareValuesBy()函数来简洁的实现compareTo方法,按顺序依次调用回调方法,两两一组做比较,并返回结果

集合和区间之间的约定

  1. 通过使用下标来访问元素: get , set
    a[index] 称为下标运算符;读取元素会被转换成get方法,写入元素会调用set方法
    自定义类添加下标索引:定义一个名为get函数或者set函数,并标记为operator,参数类型可以是任意类型(数组的是Int, map的是键的类型…)
    第七章:运算符重载及其他约定_第5张图片
  2. in的约定
    in运算符:检查某个对象是否属于集合 , 相对应的函数叫contains
    重载:operator fun contains(args…) : Boolean{…}
    注意: until 开区间,不包括最后一个元素;符号… 闭区间,包含最后一个元素
  3. rangeTo的约定
    创建区间:
    在这里插入图片描述
    rangeTo是Comparable的一个扩展函数 ,其优先级低于算术运算符,调用方法需要用括号括起来
  4. 在for循环中使用“iterator"的约定
    使用for(x in list){…}会被转换成list.iterator(),然后重复调用hasNext, next方法
    标准库已经为CharSequence定义了扩展函数iterator,所以可以遍历字符串

解构声明与组件函数

第七章:运算符重载及其他约定_第6张图片
第七章:运算符重载及其他约定_第7张图片
对于数据类,编译器为每个在主构造方法中声明的属性生成componentN函数

委托属性

  1. 委托:一种设计模式:操作的对象不用自己执行,而是把工作委托给另一个辅助的对象,辅助对象称为委托;
  2. 委托属性的基本操作:
    在这里插入图片描述
    关键字by可以用于任何符合属性委托约定规则的对象
    工作原理:
    第七章:运算符重载及其他约定_第8张图片
    按照约定:Delegate类必须具有getValue和setValue方法 (后者属于可变属性)
    第七章:运算符重载及其他约定_第9张图片
  3. 惰性初始化:by lazy()
    支持属性技术:
    第七章:运算符重载及其他约定_第10张图片
  4. 变换规则
    第七章:运算符重载及其他约定_第11张图片
    第七章:运算符重载及其他约定_第12张图片
  5. 使用委托属性把值存到map中
    第七章:运算符重载及其他约定_第13张图片
    原因:标准map和mutableMap接口已经定义了getValue, setValue扩展函数

你可能感兴趣的:(《Kotlin实战》笔记)