Kotlin实战学习笔记(七 约定)

2017-12-09  本文已影响0人  Pyrrha_89c6
  1. 重载算术运算符
data class Point(val x: Int,val y:Int){
    operator fun plus(other: Point): Point { // operator关键字修饰plus函数:a + b = a.plus(b)
        return Point(x + other.x, y + other.y)
    }
}
operator fun Point.plus(other: Point) : Point{...}//也可用扩展函数定义
Point(10,20) + Point(30,40) == Point(40,60)
对于一元运算符
operator fun Point.unaryMinus(): Point { return Point(-x,-y) } // -a
表达式 函数名
a * b times
a / b div
a % b mod
a + b plus
a - b minus
+a unaryPlus
-a unaryMinus
!a not
++a inc
--a dec
//不同类型之间使用约定运算符,类型不能调换位置
operator fun Point.times(scale: Double) : Point { .... } // Point(10,20) * 1.5 == Point(15,30)
operator fun Double.times(p: Point) : Point { .... } // 1.5 * Point(10,20) == Point(15,30)
//返回值不同
operator fun Char.times(count: Int) : String { .... } // 'a' * 3 == "aaa" 

Kotlin没有提供位运算符,用下面方式代替

中缀运算符 作用
shl 带符号左移
shr 带符号右移
ushr 无符号右移
and 按位与
or 按位或
xor 按位异或
inv 按位取反
0x0F and 0xF0 == 0 
0x0F or  0xF0 == 255
val numbers = ArrayList<Int>() 
numbers += 42 // numbers[0] == 42
//实现上面的功能需要用到plusAssign函数,类似的也有timesAssign、minusAssign
operator fun <T> MutableCollection<T>.plusAssign(element:T) { this.add(element) }
  1. 重载比较运算符
class Person(val firstName: Stirng,lastName: String) : Comparable<Person> {
    override fun compareTo(other: Person) : Int {
        //使用kotlin内置函数compareValuesBy可以很方便进行比较
        return compareValuesBy(this,other,Person::lastName,Person::firstName)
    }
}
  1. 集合与区间的约定
operator fun Point.get(index: Int) : Int{
    return when(index){
        0 -> x
        1 -> y
        else -> throw IndexOutOfBoundsException("...")
    }
}
operator fun Point.set(index: Int,value: Int) {
    return when(index){
        0 -> x = value
        1 -> y = value
        else -> throw IndexOutOfBoundsException("...")
    }
}
val p = Point(10,20) // p[1] == 20
p[0] = 20 // p[0] == 20

//支持多维
operator fun get(rowIndex: Int,colIndex: Int) 
matrix[row,col]
  1. 结构声明和组件函数
val p = Point(10,20)
val (x,y) = p // x == 10 y == 20
class Point(val x: Int,val y: Int) { //componentN:N<=5 只能到前五个
    operator fun component1() = x
    operator fun component2() = y
}
  1. 委托属性
class Delegate {
    operator fun getValue(...) {..}
    operator fun setValue(...,value: Tyep) {..}
}
class Foo{
    var p: Type by Delegate() //通过 Delegat来对p操作
}
class Person(val name: String){
    val emails by lazy { loadEmails(this) }
}
上一篇 下一篇

猜你喜欢

热点阅读