前言
Kotlin竟终,2017年Google IO大會(huì)上并蝗,黃袍加身祭犯,一舉成為Google的親兒子。如果你現(xiàn)在問:做Android開發(fā)滚停,要學(xué)Kotlin嗎沃粗?百分之九十的人會(huì)告訴你要。你可能會(huì)冷笑一下键畴,呵呵最盅,老子的項(xiàng)目都是Java開發(fā),公司都沒有一個(gè)項(xiàng)目是Kotlin寫的。沒錯(cuò)涡贱,目前Kotlin在國(guó)內(nèi)的推廣力度沒有國(guó)外大咏删,幾年過(guò)去了,國(guó)內(nèi)很多公司還是抱緊Java大腿问词,沒有擁抱Kotlin督函。但是你如果有經(jīng)常上Google的Android開發(fā)者網(wǎng)站的話,你會(huì)發(fā)現(xiàn)很多新的東西戏售,都是用Kotlin給你寫demo了,然后GitHub上很多新的開源項(xiàng)目也直接用Kotlin擼了草穆。所以你敢不學(xué)Kotlin嗎?不學(xué)灌灾,你到時(shí)連抄別人的代碼,都不會(huì)抄了悲柱。
好了锋喜,吹了這么多,其實(shí)老子就是想引誘你學(xué)習(xí)Kotlin豌鸡。來(lái)吧嘿般,一步一步來(lái),試一下涯冠,用的不爽炉奴,你就退出Android界吧。而且要使用一門語(yǔ)言蛇更,也不是說(shuō)要學(xué)到非常精通才可以使用瞻赶,你只要學(xué)會(huì)了這門語(yǔ)言的基本語(yǔ)法后,就可以大膽的使用了派任,之后在使用的過(guò)程中不斷的進(jìn)入學(xué)習(xí)和研究就可以了砸逊。說(shuō)真的,一開始看Kotlin,確實(shí)有點(diǎn)別扭掌逛,但看多幾天师逸,你會(huì)發(fā)出真香的感慨,到處都是棉花糖(語(yǔ)法糖)豆混。
(手動(dòng)喘氣)吹不下去了篓像,系好安全帶,開車了皿伺。拿上你的Java大寶劍遗淳,去挑戰(zhàn)Kotlin吧!
可見修飾符
在 Kotlin 中一切都是默認(rèn)為 public 的心傀,而且Kotlin跟Java一樣屈暗,也有一套完整豐富的可見性修飾符。比如:private,protected,internal。它們都已不同的方式降低了數(shù)據(jù)的可見性养叛。來(lái)种呐,下面的代碼注釋會(huì)給你講明白這些。
//Demo.kt
//默認(rèn)的可見性都是public,所有文件都可見
val isVisible = true
//只在本文件(Demo.kt)中可見
priva val isHidden = true
//同 Module下的所有文件都可見
internal val almostVisible = true
class Sample{
//默認(rèn)的可見性是public
val isVisible = true
//只對(duì)子類可見
protected val isInheritable = true
//僅對(duì)自己類可見
private val isHidden = true
}
附上Java和Kotlin的修飾符的詳細(xì)對(duì)比
Java(默認(rèn)為 default)
修飾符 | 作用 |
---|---|
public | 所有類可見 |
default | 同一包下的類可見 |
protected | 子類可見 |
private | 僅對(duì)自己類可見 |
Kotlin(默認(rèn)為 public)
修飾符 | 作用 |
---|---|
public | 所有類可見 |
internal | 同 Module 下的類可見 |
protected | 子類可見 |
private | 僅對(duì)自己類可見 |
Elvis 操作符
在使用安全調(diào)用符調(diào)用可空變量中的成員方法或?qū)傩詴r(shí)弃甥,如果當(dāng)前變量為空爽室,則會(huì)返回一個(gè)null值,但有時(shí)即使當(dāng)前變量為null淆攻,也不想返回一個(gè)null值而是指定一個(gè)默認(rèn)值阔墩,此時(shí)該如何處理呢?Kotlin中提供了一個(gè)Elvis操作符(?:)瓶珊,通過(guò)Elvis操作符(?:)可以指定可空變量為null時(shí)啸箫,調(diào)用該變量中的成員方法或?qū)傩詴r(shí),返回一個(gè)默認(rèn)值或直接返回代碼塊伞芹。
//當(dāng)person為null時(shí)忘苛,設(shè)置person name默認(rèn)值為“unknown”
val name : String = person?.name ?: "unknown"
//當(dāng)person為null時(shí),直接返回
val age = person?.age ?: return
字符串String模板
Kotlin允許使用字符串模板來(lái)簡(jiǎn)化字符串格式化唱较。它可以使用"$變量名"或"${表達(dá)式}"直接在字符串中插入數(shù)值扎唾。
val language = "Kotlin"
//text的值為Kotlin has 6 characters
val text = "$language has ${language.length} characters"
//Java中要實(shí)現(xiàn)同樣的效果,代碼為
//String text = language + "has" + language.length + "characters"
when 表達(dá)式
強(qiáng)大的判斷器南缓,Kotlin 的 when 表達(dá)式幾乎可以匹配任何的東西胸遇。比如:字面值,枚舉汉形,數(shù)字范圍狐榔,甚至可以調(diào)用任意函數(shù)等等!
fun getScore(name : String) : Int {
return when (name) {
"Li" -> 90 //name為L(zhǎng)i時(shí)获雕,返回值90
"Cheng" -> 80 //name為Cheng時(shí)薄腻,返回值80
else - > 0 //以上數(shù)據(jù)都配置不上時(shí),返回值0届案。
}
}
如果我們不在when 語(yǔ)句中傳入?yún)?shù)的話庵楷,還可以這么寫:
fun getScore(name : String) : Int {
return when {
name == "Li" -> 90 //name為L(zhǎng)i時(shí),返回值90
name == "Cheng" -> 80 //name為Cheng時(shí)楣颠,返回值80
name == "Guo" -> 70 //name為Guo時(shí)尽纽,返回值70
else - > 0 //以上數(shù)據(jù)都配置不上時(shí),返回值0童漩。
}
}
你可能會(huì)覺得這種無(wú)參數(shù)的when語(yǔ)句寫起來(lái)比較冗余弄贿,沒必要這么寫,但是當(dāng)判斷條件不是同等類型的數(shù)據(jù)時(shí)矫膨,就必須使用這種寫法才能實(shí)現(xiàn)差凹。
以上面的例子為例期奔,假如名字以"Li"開頭的人,他的分?jǐn)?shù)都是90分以上危尿。這種場(chǎng)景如果用帶參數(shù)的when 語(yǔ)句來(lái)寫就無(wú)法實(shí)現(xiàn)呐萌,而使用不帶參數(shù)的when 語(yǔ)句就可以這樣寫
fun getScore(name : String) : Int {
return when {
name.startWith ("Li") -> 90 //name的開頭為L(zhǎng)i時(shí),返回值90
name == "Cheng" -> 80 //name為Cheng時(shí)谊娇,返回值80
name == "Guo" -> 70 //name為Guo時(shí)肺孤,返回值70
else - > 0 //以上數(shù)據(jù)都配置不上時(shí),返回值0济欢。
}
}