項目一期在收尾了終於有時間折騰了,一個多月以來Kotlin從入門到如今,堅持用來開發的切身感覺。由於語法與Java的區別挺大的一開始很想放棄,若是不是由於項目在使用,想必不多人會嘗試這樣一門小衆語言,可是習慣後會發現這些年究竟浪費多少時間在寫無用的Java代碼了,Kotlin在兼容Java的基礎上還能大大提高開發效率。Kotlin有許多特性但對於開發來講,快速適應和學習更爲重要,不少時候咱們都是在不明白其緣由就開始使用的,正如咱們不可能把Retrofit原理研究透才使用它。只要它足夠穩定成熟,並能有效的提高開發效率都是值得嘗試的。鄙人不才,目前使用Kotlin的緣由主要是由於它語法簡潔,支持lambda表達式,強大的when語法,不用寫分號結尾,光是這些就足以讓我喜歡Kotlin。至於空安全之類的特性,畢竟服務端數據類型太多null了並沒多大感觸,這些特性在實際應用中潛移默化的就吸取了,以致於如今遇到幾個Java編寫的代碼,都有些不適應了。html
在Kotlin中冒號:
用萬能來稱呼毫不爲過。常量變量的類型聲明,函數的返回值,類的繼承都須要它java
//val表示常量var表示變量聲明 val name: String = "tutu" //省略類型說明 var age = "23" //fun表示函數 fun getName(): String{ return "tutu" } //類繼承 class UserList<E>(): ArrayList<E>() { //... }
除此以外還有一個特別的地方也須要它,使用Java類的時候。Kotlin最終會仍是編譯成Java字節碼,使用到Java類是必然的,在Kotlin語法以下git
val intent = Intent(this, MainActivity::class.java)
類名::class.java
沒有爲何就這麼寫記着就是github
除了冒號另外一個重要符號@
,想必用到內部類和匿名內部類的地方必定不少,再加上支持lambda語法,沒有它誰告訴你this
和return
指的是哪個web
class User { inner class State{ fun getUser(): User{ //返回User return this@User } fun getState(): State{ //返回State return this@State } } }
1). Kotlin特點
Java的getter/setter
方法自動轉換成屬性,對應到Kotlin屬性的調用瀏覽器
public class User { private String name; private String age; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAge() { return age; } public void setAge(String age) { this.age = age; } }
這樣一個Java類在Kotlin中只需這樣調用安全
val user = User() //賦值 user.name = "tutu" user.age = "23" //取值 val name = user.name val age = user.age
反之Kotlin的屬性自動生成Java的getter/setter
方法,方便在Java中調用,一樣的定義在Kotlin中函數
class User { var name: String? = null var age: String? = null }
咱們的getter/setter
方法有時不會這麼簡單,這就須要自定義getter/setter
了,另起一行設置get()/set(value)方法,實現一個Java中經常使用的單例,這裏只爲了展現,單例在Kotlin有更簡單的方法實現,只要在 package 級別建立一個 object 便可學習
class User { companion object { @Volatile var instance: User? = null get() { if (field == null) { synchronized(User::class.java) { if (field == null) field = User() } } return field } } var name: String? = null var age: String? = null }
自定義getter/setter
重點在field
,跟咱們熟悉所Java的this
指代當前類同樣,field
指代當前參數,直接使用參數名instance
代替不會報錯但單例就沒效果了this
2). 字符串模板
在Java中拼接字符串的代碼可讀性都不好,在Kotlin字符串拼接變得很是簡潔,只需用$
後面加上參數名,複雜的參數要加上{}
val user = User() //賦值 user.name = "tutu" user.age = "23" //取值 val name = user.name val age = user.age var userInfo = "name:${user.name}, age:$age" //輸出結果:name:tutu, age:23
3). lambda
一開始以爲lambda很高級徹底看不懂,其實很簡單的就是把接口名、方法名和參數類型省掉不寫再加個->
罷了,明白這點了就不介紹。
1). 延遲加載
2). 流程控制
內容上一篇寫過參考 Android Kotlin 學習筆記,不重複介紹
Kotlin的空安全設計對於聲明可爲空的參數,在使用時要進行空判斷處理,有兩種處理方式一種像Java同樣拋出空異常,字段後加!!
,另外一種不作處理直接跳過,字段後加?
//類型後面加?表示可爲空 var age: String? = "23" //拋出空指針異常 val ageInt = age!!.toInt() //不作處理跳過 val ages = age?.toInt()
內部類和參數默認爲public,而在Java中爲private
類默認爲不可繼承(final),想要可被繼承要聲明爲open
或abstract
取消了static關鍵字,靜態方法和參數統一寫在companion object
塊
internal模塊內可見,inner內部類
以上僅是對使用頻率較高的語法總結,學會基本能夠閱讀Kotlin代碼,遇到點問題Google速查一下,至於智能轉換、類型推導之類的不用說使用後喜歡天然就會了。固然這只是kotlin的基本語法,方便Java快速熟悉kotlin,深刻學習還請閱讀相關資料。
在線學習
Kotlin 官方文檔
Kotlin 中文文檔
Kotlin 中文文檔 這個感受像官網的中文版,翻譯質量很好,不過左側的分類無法點擊,不知是否是瀏覽器問題,我就一個個羅列出來了
入門
基礎
類和對象
函數和lambda表達式
其餘
文檔
互操做
FAQ
最終找到了翻譯出處kotlin-web-site-cn
http://tanfujun.com/kotlin-web-site-cn/