四,Kotlin-表達式

1,常量與變量(val,val)

只讀變量
  • 使用val表示
  • 類似Java中final
  • 不可重復進行賦值,只能被賦值一次
  • 可分為運行時常量和編譯器常量
運行時常量:編譯器在編譯時并不能確切的知道它的值是什么;編譯器在引用到該常量時使用的是
編譯器常量:編譯器在編譯時已經知道該常量的值,并且在引用到改常量的地方直接賦值為該常量的值,以提高執(zhí)行效率
//運行時常量
val FINAL_STRING: String = "HelloWord"
//編譯器常量需要加const修飾
const val FINAL_STRING_01: String = "HelloWord"
//等同于Java中 public static final String FINAL_STRING_01 = "HelloWord";
關于const的限制
  • 只能定義在全局范圍內
  • 只能修飾基本類型(String也可以)
  • 必須立即用字面量進行初始化

同時有一點需要注意的是:val 只讀變量作為類的屬性值時可以為其復寫一個getter,這樣每次讀取的值就是不相同的

class Person {
    val age: Int
        get() {
            return (Math.random() * 10).toInt()
        }
}

fun main() {
    val person = Person()
    for (i in 1..5) {
        println(person.age)
    }
}
變量
  • var 可被重復賦值
var str: String = "HelloWord"
fun main(args: Array<String>) {
    str = "HiBaby"
}
類型推導
  • 編譯器可以推導出的類型
fun main(args: Array<String>) {
    //類型推導
    var intA = 1//編譯器推導出是Int
    var StringA = "AAAA"http://編譯器推導出是String
    var StringB = "BBBB" + 6//編譯器推導出是String
}

2,分支表達式

<1> if ..else..
  • Kotlin中if else 是表達式,而java中語句
    var c = 0
    var a = 2
    if (a == 2) {
        c = 3
    } else {
        c = 4
    }
//兩者含義相同,和Java中三元表達式相同
    c = if (a == 2) 3 else 4
<2> when
  • when 對應Java中swith語句
 when (a) {
        2 -> c = 3
        3 -> c = 4
        else -> c = 5
    }
    c = when (a) {
        2 -> 3
        3 -> 4
        else -> 5
    }

也可以將條件寫在when語句內部

 var d: Any = "String"

    c = when {
        d is String -> d.length
        d == 1 -> 2
        else -> 5
    }
<3> try ..catch
  • 也可以作為表達式
 try {
        c = a / b
    } catch (e: Exception) {
        c = 0
    }

    c = try {
        a / b
    } catch (e: Exception) {
        0
    }

3,運算符和中綴表達式

<1>運算符
  • Kotlin中支持運算符重載
  • 運算符重載的范圍僅限于官方指定的符號
常見運算符
  • == 與 equals
"Hello".equals("Word")
"Hello" == "Word"
  • +與 plus
2 + 3
2.plus(3)
  • in 與 contains
    var list = listOf(1, 2, 3)
    2 in list
    list.contains(2)
  • [] 與 get
  • [] 與 set
var map = mutableMapOf(
        "h" to 1,
        "e" to 2
    )
    var a = map["h"]
    map["h"] = 3
  • 大于號和comPareTo
    1>2
    1.compareTo(2)>0
  • () 與invoke
    var tt = fun(arg1: Int, arg2: Int): Int {
        return arg1 + arg2
    }
    tt(1,2)
    tt.invoke(1,2)
也就是什么意思呢.比如我定義了一個類 我想讓這個的對象,能夠相加和相減 或者>等等,我只要重載了他的plus(),minus(),compareTo()等方法就可以實現(xiàn)對象的操作

定義形式 :
1,類的外部 operator fun <類名>.plus(參數(shù)):<返回值類型>
2,類的內部 operator fun plus(參數(shù)):<返回值類型>

<2>中綴表達式
var book = Book()
var desk = Desk()
book on desk
---
class Book
class Desk
infix fun Book.on(other: Desk) {

}

<4>,Lambda表達式

  • Kotlin中Lambda表達式就是匿名函數(shù)的簡寫
  • 和Java中不同的是,Java的Lambda表達式更像是一種接口形式的語法糖,所有Java中的Lanbda表達式都需要一個接收類型,該接受類型,必須是一個接口并只有一個方法
  • Lambda表達式返回值的類型就是表達式最后一句的返回類型
具體寫法
var func = fun(i: Int) {
    println("----$i-----")
}

var fund = { i: Int ->
    println("----$i-----")
}
//當一個函數(shù)只有一個參數(shù)沒寫時默認就是it
var fune: Function1<Int, Unit> = {
    println("----$it-----")
}
var funf = { it: Int ->
    println("----$it-----")
}
調用
    func(1)
    func.invoke(1)
    fund(2)
    fune(3)
    funf(4)

小案例:給字符串增加四則運算

fun main() {
    println("WJF" * 2)
    println("HelloWorld" - 'l')
    println("HelloWorld" / 'l')
}


operator fun String.minus(char: Char): String =
    if (this.contains(char)) {
        this.replace("$char", "", false)
    } else {
        this
    }


operator fun String.times(times: Int): String {
//    var result = this
//    for (i in 1..times) {
//        result = result.plus(this)
//    }
//    return result
    return (1..times).joinToString(""){ this }
}

operator fun String.div(right: Any): Int {
//    return if (char in this) {
//        var count = 0
//        this.forEach {
//            if (it == char) {
//                count++
//            }
//        }
//        count
//    } else {
//        0
//    }
    val toString = right.toString()
    return this
        .windowed(toString.length, 1) { it == toString }
        .count { it }
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末蔗草,一起剝皮案震驚了整個濱河市刺覆,隨后出現(xiàn)的幾起案子活翩,更是在濱河造成了極大的恐慌戳玫,老刑警劉巖万栅,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異伞辛,居然都是意外死亡烂翰,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進店門蚤氏,熙熙樓的掌柜王于貴愁眉苦臉地迎上來甘耿,“玉大人,你說我怎么就攤上這事竿滨〖烟瘢” “怎么了?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵于游,是天一觀的道長毁葱。 經常有香客問我,道長贰剥,這世上最難降的妖魔是什么倾剿? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮蚌成,結果婚禮上前痘,老公的妹妹穿的比我還像新娘。我一直安慰自己担忧,他們只是感情好芹缔,可當我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著瓶盛,像睡著了一般最欠。 火紅的嫁衣襯著肌膚如雪坡锡。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天窒所,我揣著相機與錄音鹉勒,去河邊找鬼。 笑死吵取,一個胖子當著我的面吹牛禽额,可吹牛的內容都是我干的。 我是一名探鬼主播皮官,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼脯倒,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了捺氢?” 一聲冷哼從身側響起藻丢,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎摄乒,沒想到半個月后悠反,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡馍佑,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年斋否,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片拭荤。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡茵臭,死狀恐怖,靈堂內的尸體忽然破棺而出舅世,到底是詐尸還是另有隱情旦委,我是刑警寧澤,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布雏亚,位于F島的核電站缨硝,受9級特大地震影響,放射性物質發(fā)生泄漏评凝。R本人自食惡果不足惜追葡,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望奕短。 院中可真熱鬧宜肉,春花似錦、人聲如沸翎碑。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽日杈。三九已至遣铝,卻和暖如春佑刷,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背酿炸。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工瘫絮, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人填硕。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓麦萤,卻偏偏與公主長得像,于是被迫代替她去往敵國和親扁眯。 傳聞我的和親對象是個殘疾皇子壮莹,可洞房花燭夜當晚...
    茶點故事閱讀 42,916評論 2 344