Kotlin實戰(zhàn)學(xué)習(xí)筆記(七 約定)

  1. 重載算術(shù)運(yùn)算符
  • 重載算術(shù)運(yùn)算符
data class Point(val x: Int,val y:Int){
    operator fun plus(other: Point): Point { // operator關(guān)鍵字修飾plus函數(shù):a + b = a.plus(b)
        return Point(x + other.x, y + other.y)
    }
}
operator fun Point.plus(other: Point) : Point{...}//也可用擴(kuò)展函數(shù)定義
Point(10,20) + Point(30,40) == Point(40,60)
對于一元運(yùn)算符
operator fun Point.unaryMinus(): Point { return Point(-x,-y) } // -a
表達(dá)式 函數(shù)名
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
//不同類型之間使用約定運(yùn)算符,類型不能調(diào)換位置
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沒有提供位運(yùn)算符,用下面方式代替

中綴運(yùn)算符 作用
shl 帶符號左移
shr 帶符號右移
ushr 無符號右移
and 按位與
or 按位或
xor 按位異或
inv 按位取反
0x0F and 0xF0 == 0 
0x0F or  0xF0 == 255
  • 重載復(fù)合賦值運(yùn)算符
    通常定義了plus、times ,+=福铅、*=也生效
val numbers = ArrayList<Int>() 
numbers += 42 // numbers[0] == 42
//實現(xiàn)上面的功能需要用到plusAssign函數(shù)弟胀,類似的也有timesAssign、minusAssign
operator fun <T> MutableCollection<T>.plusAssign(element:T) { this.add(element) }
  1. 重載比較運(yùn)算符
  • == 等于Java的equals眉厨, === 等于Java的 ==
    • override fun equal(obj: Any? : Boolean { ... } //就是重寫 ==,沒有用operator 關(guān)鍵字
    • data類型編譯器會默認(rèn)實現(xiàn) equals
  • compareTo 和Java一樣
class Person(val firstName: Stirng,lastName: String) : Comparable<Person> {
    override fun compareTo(other: Person) : Int {
        //使用kotlin內(nèi)置函數(shù)compareValuesBy可以很方便進(jìn)行比較
        return compareValuesBy(this,other,Person::lastName,Person::firstName)
    }
}
  1. 集合與區(qū)間的約定
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]
  • a in c 相當(dāng)于 c.contains(a) :
    operator fun Obj.contains(p: Type) : Boolean
  • start..end 相當(dāng)于 start.rangeTo(end) ! ..優(yōu)先級低于算術(shù)運(yùn)算符 ! :
    operator fun <T: Comparable<T>> T.rangeTo(that : T) : ClosedRange<T>
  • for循環(huán) 對應(yīng) iterator(和Java相同)
    operator fun CharSequece.iterator() : CharIterator
  1. 結(jié)構(gòu)聲明和組件函數(shù)
  • 定義
val p = Point(10,20)
val (x,y) = p // x == 10 y == 20
  • kotlin實現(xiàn)解構(gòu)
class Point(val x: Int,val y: Int) { //componentN:N<=5 只能到前五個
    operator fun component1() = x
    operator fun component2() = y
}
  • 對于元組Kotlin有Pair锌奴、Triple類
  1. 委托屬性
  • 簡單實現(xiàn)
class Delegate {
    operator fun getValue(...) {..}
    operator fun setValue(...,value: Tyep) {..}
}
class Foo{
    var p: Type by Delegate() //通過 Delegat來對p操作
}
  • kotlin有個懶加載 by lazy()就是使用委托
class Person(val name: String){
    val emails by lazy { loadEmails(this) }
}
  • 實現(xiàn)委托屬性(原理) P198 7.5.3 代碼清單 7.19-24
  • 一個操作數(shù)據(jù)庫框架exposed就是通過委托實現(xiàn)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市憾股,隨后出現(xiàn)的幾起案子鹿蜀,更是在濱河造成了極大的恐慌,老刑警劉巖服球,帶你破解...
    沈念sama閱讀 223,126評論 6 520
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件茴恰,死亡現(xiàn)場離奇詭異,居然都是意外死亡斩熊,警方通過查閱死者的電腦和手機(jī)琐簇,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,421評論 3 400
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來座享,“玉大人婉商,你說我怎么就攤上這事≡眩” “怎么了丈秩?”我有些...
    開封第一講書人閱讀 169,941評論 0 366
  • 文/不壞的土叔 我叫張陵,是天一觀的道長淳衙。 經(jīng)常有香客問我蘑秽,道長饺著,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,294評論 1 300
  • 正文 為了忘掉前任肠牲,我火速辦了婚禮幼衰,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘缀雳。我一直安慰自己渡嚣,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 69,295評論 6 398
  • 文/花漫 我一把揭開白布肥印。 她就那樣靜靜地躺著识椰,像睡著了一般。 火紅的嫁衣襯著肌膚如雪深碱。 梳的紋絲不亂的頭發(fā)上腹鹉,一...
    開封第一講書人閱讀 52,874評論 1 314
  • 那天,我揣著相機(jī)與錄音敷硅,去河邊找鬼功咒。 笑死,一個胖子當(dāng)著我的面吹牛绞蹦,可吹牛的內(nèi)容都是我干的力奋。 我是一名探鬼主播,決...
    沈念sama閱讀 41,285評論 3 424
  • 文/蒼蘭香墨 我猛地睜開眼坦辟,長吁一口氣:“原來是場噩夢啊……” “哼刊侯!你這毒婦竟也來了章办?” 一聲冷哼從身側(cè)響起锉走,我...
    開封第一講書人閱讀 40,249評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎藕届,沒想到半個月后挪蹭,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,760評論 1 321
  • 正文 獨居荒郊野嶺守林人離奇死亡休偶,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,840評論 3 343
  • 正文 我和宋清朗相戀三年梁厉,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片踏兜。...
    茶點故事閱讀 40,973評論 1 354
  • 序言:一個原本活蹦亂跳的男人離奇死亡词顾,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出碱妆,到底是詐尸還是另有隱情肉盹,我是刑警寧澤,帶...
    沈念sama閱讀 36,631評論 5 351
  • 正文 年R本政府宣布疹尾,位于F島的核電站上忍,受9級特大地震影響骤肛,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜窍蓝,卻給世界環(huán)境...
    茶點故事閱讀 42,315評論 3 336
  • 文/蒙蒙 一腋颠、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧吓笙,春花似錦淑玫、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,797評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至侮穿,卻和暖如春歌径,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背亲茅。 一陣腳步聲響...
    開封第一講書人閱讀 33,926評論 1 275
  • 我被黑心中介騙來泰國打工回铛, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人克锣。 一個月前我還...
    沈念sama閱讀 49,431評論 3 379
  • 正文 我出身青樓茵肃,卻偏偏與公主長得像,于是被迫代替她去往敵國和親袭祟。 傳聞我的和親對象是個殘疾皇子验残,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,982評論 2 361

推薦閱讀更多精彩內(nèi)容