Kotlin在Android開發領域已經有很長一段時間了,從去年開始也致力於在團隊中推廣Kotlin在項目中進行產品開發,相比於Java,咱們更關注的就是Kotlin編譯移動端代碼的快速(大量的語法糖)、空安全、與Java的高度融合以及google的大力扶持(如今官網上的代碼幾乎都是Kotlin來寫的)。雖然Kotlin與Java同爲jvm語言,並且語法很像,學習成本較低,可是有些點仍是須要注意下的,今天這篇文章就是前段時間在業務中遇到的一些小的語法問題進行一下總結安全
什麼是表達式,什麼是語句,這兩個概念彷佛你們平時不多注意,也彷佛沒見過什麼很官方的解釋,這裏說一下本身的理解。bash
表達式:表達式通常由變量或者數值以及運算符組合而成,擁有返回值。jvm
語句:語句能夠理解爲一種行爲,通常包含表達式,能夠執行,例如for語句,if語句,賦值語句等。 舉例:ide
if(a>b){
test()
}
fun test(){
println("test")
}
複製代碼
這其中a>b就是表達式,而if就是語句,這裏test函數的調用test()其實也能夠理解爲一個表達式,它也有返回值,在kotlin中返回unit。函數
在Java中,定義一個函數沒有返回值時咱們會聲明這個函數的返回類型爲Void學習
public void test(){
return;//return也能夠不寫
}
複製代碼
而在Kotlin中,咱們定義一個函數沒有返回值得時候不須要什麼特殊聲明ui
public fun test(){
return //return也能夠不寫
}
複製代碼
可是實際上這個函數也能夠這樣定義google
public fun test():Unit{
return Unit
}
複製代碼
這兩種定義方式實際上是相同的,可是你能夠看到,在Kotlin中Unit就是和Java中的void相對應的。再來看一下Unit的定義spa
public object Unit {
override fun toString() = "kotlin.Unit"
}
複製代碼
這是一個單例類。code
這裏有一個很重要的點,那就是Unit不等於null,有些人會誤解Unit與null是相同的,實際上這實際上是兩個不一樣的概念,Unit是一個單例對象,佔用內存的;而null則是並無在內存中定義,佔用內存的
貓王運算符?:,這個算是Kotlin提供的一個重要語法糖了,還有一個和它很像的就是?.固然,含義是不同的,?.是用來判斷一個對象是否爲null的,若是對象爲null,就返回null,不然就執行?.的後面的對象的方法。 下面摘抄一段Kotlin官網中對?:的解釋:
若是 ?: 左側表達式非空,elvis 操做符就返回其左側表達式,不然返回右側表達式。 請注意,當且僅當左側爲空時,纔會對右側表達式求值。 請注意,由於 throw 和 return 在 Kotlin 中都是表達式,因此它們也能夠用在 elvis 操做符右側。
看這個定義,這裏說的表達式爲空是什麼意思,函數返回Unit是函數返回爲空嗎?很明顯,前面我們說了,函數返回爲Unit與函數返回null是兩個意思。有的時候,?.和?:聯合使用時,會讓人以爲有些疑惑,舉個例子:
fun main() {
getString()?.let {
test(it)
} ?: println("not print test")
}
fun getString():String?{
return "9"
}
fun test(content:String){
println("test $content")
}
//代碼結果:
test 9
fun main() {
getString()?.let {
test(it)
} ?: println("not print test")
}
fun getString():String?{
return null
}
fun test(content:String){
println("test $content")
}
//代碼結果:
not print test
複製代碼
上面的代碼,當getString放回"9"和返回null時,出現了不一樣的結果。當返回"9"時,由於,9不爲空,執行"9"這個字符串的let方法,這個let方法是一個泛型擴展方法,有一個泛型返回值,同時根據lambda表達式的定義,最後一行的調用的表達式的值就是返回值,由於test沒有返回值,因此最後的返回值是Unit,前面說了Unit不是null,因此不會打印not print test。再來看當getString返回null時,這個時候由於getString返回爲null,因此壓根就不會執行let方法,表達式的值爲null,根據Elvis運算符的定義,若是?:前面的表達式爲null,那麼就會執行後面的表達式,因此天然就會打印not print test。
有的人會問爲何?:叫作貓王運算符,一是?:Kotlin的官方叫法是Elvis,和貓王的本命Elvis Presley名相同,第二點我估計是髮型很像。
很早之前聽過一段時間貓王,可是真正留下印象的好像也只有那首《hey jude》。仍是喜歡朴樹,有那個純真時代一個詩人的矯情和瀟灑。 關注個人公衆號