Kotlin 編程三分鐘入門
為什么使用Kotlin
項目一期在收尾了終于有時間折騰了,一個多月以來Kotlin從入門到現(xiàn)在,堅持用來開發(fā)的切身感受。因為語法與Java的區(qū)別挺大的一開始很想放棄,如果不是因為項目在使用,想必很少人會嘗試這樣一門小眾語言,但是習(xí)慣后會發(fā)現(xiàn)這些年究竟浪費多少時間在寫無用的Java代碼了,Kotlin在兼容Java的基礎(chǔ)上還能大大提升開發(fā)效率。Kotlin有許多特性但對于開發(fā)來說,快速適應(yīng)和學(xué)習(xí)更為重要,很多時候我們都是在不明白其原因就開始使用的,正如我們不可能把Retrofit原理研究透才使用它。只要它足夠穩(wěn)定成熟,并能有效的提升開發(fā)效率都是值得嘗試的。鄙人不才,目前使用Kotlin的原因主要是因為它語法簡潔,支持lambda表達(dá)式,強(qiáng)大的when語法,不用寫分號結(jié)尾,光是這些就足以讓我喜歡Kotlin。至于空安全之類的特性,畢竟服務(wù)端數(shù)據(jù)類型太多null了并沒多大感觸,這些特性在實際應(yīng)用中潛移默化的就吸收了,以至于現(xiàn)在遇到幾個Java編寫的代碼,都有些不適應(yīng)了。
修改說明
突然火了一臉懵逼,Google IO的影響真是不容小覷。避免誤人子弟還是修改下比較好,也就把上一篇文章的基礎(chǔ)知識也搬遷過來,移除過期鏈接。
Kotlin 基本語法
先說個學(xué)習(xí)Kotlin語法的小竅門,將代碼用Java寫好,然后Code/Conver Java File to Kotlin File轉(zhuǎn)換成Kotlin代碼,或者將Java代碼復(fù)制到Kotlin文件會提示轉(zhuǎn)換也是挺方便的,比較差異很容易就能理解了,一開始難免不適應(yīng)習(xí)慣后相信你一定會喜歡上Kotlin
1). 定義
忘掉Java的那一套寫法不然會很不適應(yīng)的,Kotlin有自己的特性不該被Java的思維所束縛。在Kotlin中常量用val聲明,變了用var聲明,關(guān)鍵字在前面,類型以冒號:隔開在后面,也可以省略直接賦值,類型后帶問號?表示可為空類型(默認(rèn)空安全)。
常量val延遲加載by lazy{},默認(rèn)線程安全關(guān)閉線程安全lazy(LazyThreadSafetyMode.NONE){},變量var延遲加載lateinit。
//常量數(shù)組int[][][] arrs = new int[3][2][1]; val arrs = Array(3) { Array(2) { IntArray(1) } } //空安全變量 var str: String = "hello" //可為空字符串變量 var str1: String? = null
2). 條件
if...else 正常使用,不過移除了switch用更強(qiáng)大的when替代,when子式可以是各種返回Boolean的表達(dá)式
val x = 7 when (x) { in 1..10 -> print("x is in the range") in validNumbers -> print("x is valid") !in 10..20 -> print("x is outside the range") else -> print("none of the above") }
3). 循環(huán)
while 和 do...while 同Java并無區(qū)別,for則有很大改變并多出了幾個變種
val list = ArrayList<String>() //遞增for (int i = 0; i < list.size(); i++) for (i in list.indices) { print(list[i]) } //遞增for (int i = 2; i < list.size(); i++) for (i in 2..list.size-1) { print(list[i]) } //遞減for (int i = list.size(); i >= 0; i--) for (i in list.size downTo 0) { print(list[i]) } //操作列表內(nèi)的對象 for (item in list) { print(item) } //加強(qiáng)版 for((i, item) in list.witnIndex()) { print(list[i]) print(item) } //變種版 list.forEach { print(it) } list.forEach { print(it) } list.forEachIndexed { i, s -> print(list[i]) print(s) } list.forEachIndexed(object :(Int,String) -> Unit{ override fun invoke(i: Int, s: String) { print(list[i]) print(s) } })
萬能的冒號
在Kotlin中冒號:用萬能來稱呼絕不為過。常量變量的類型聲明,函數(shù)的返回值,類的繼承都需要它
//val表示常量var表示變量聲明 val name: String = "tutu" //省略類型說明 var age = "23" //fun表示函數(shù) fun getName(): String{ return "tutu" } //類繼承 class UserList<E>(): ArrayList<E>() { //... }
除此之外還有一個特別的地方也需要它,使用Java類的時候。Kotlin最終會還是編譯成Java字節(jié)碼,使用到Java類是必然的,在Kotlin語法如下
val intent = Intent(this, MainActivity::class.java)
類名::class.java沒有為什么就這么寫記著就是
我是誰的@
除了冒號另一個重要符號@,想必用到內(nèi)部類和匿名內(nèi)部類的地方一定很多,再加上支持lambda語法,沒有它誰告訴你this和return指的是哪一個
class User { inner class State{ fun getUser(): User{ //返回User return this@User } fun getState(): State{ //返回State return this@State } } }
偷懶的方法
1). Kotlin特色
Java的getter/setter方法自動轉(zhuǎn)換成屬性,對應(yīng)到Kotlin屬性的調(diào)用
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中只需這樣調(diào)用
val user = User() //賦值 user.name = "tutu" user.age = "23" //取值 val name = user.name val age = user.age
反之Kotlin的屬性自動生成Java的getter/setter方法,方便在Java中調(diào)用,同樣的定義在Kotlin中
class User { var name: String? = null var age: String? = null }
我們的getter/setter方法有時不會這么簡單,這就需要自定義getter/setter了,另起一行設(shè)置get()/set(value)方法,實現(xiàn)一個Java中常用的單例,這里只為了展示,單例在Kotlin有更簡單的方法實現(xiàn),只要在 package 級別創(chuàng)建一個 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指代當(dāng)前類一樣,field指代當(dāng)前參數(shù),直接使用參數(shù)名instance代替不會報錯但單例就沒效果了
2). 字符串模板
在Java中拼接字符串的代碼可讀性都很差,在Kotlin字符串拼接變得非常簡潔,只需用$后面加上參數(shù)名,復(fù)雜的參數(shù)要加上{}
val user = User() //賦值 user.name = "tutu" user.age = "23" //取值 val name = user.name val age = user.age var userInfo = "name:${user.name}, age:$age" //輸出結(jié)果:name:tutu, age:23
3). lambda
一開始覺得lambda很高級完全看不懂,其實很簡單的就是把接口名、方法名和參數(shù)類型省掉不寫再加個->罷了,明白這點了就不介紹。
新面孔
1). 延遲加載
2). 流程控制
空判斷
Kotlin的空安全設(shè)計對于聲明可為空的參數(shù),在使用時要進(jìn)行空判斷處理,有兩種處理方式一種像Java一樣拋出空異常,字段后加!!,另一種不做處理直接跳過,字段后加?
//類型后面加?表示可為空 var age: String? = "23" //拋出空指針異常 val ageInt = age!!.toInt() //不做處理跳過 val ages = age?.toInt()
注意事項
內(nèi)部類和參數(shù)默認(rèn)為public,而在Java中為private
類默認(rèn)為不可繼承(final),想要可被繼承要聲明為open或abstract
取消了static關(guān)鍵字,靜態(tài)方法和參數(shù)統(tǒng)一寫在companion object塊
internal模塊內(nèi)可見,inner內(nèi)部類
以上僅是對使用頻率較高的語法總結(jié),學(xué)會基本可以閱讀Kotlin代碼,遇到點問題Google速查一下,至于智能轉(zhuǎn)換、類型推導(dǎo)之類的不用說使用后喜歡自然就會了。當(dāng)然這只是kotlin的基本語法,方便Java快速熟悉kotlin,深入學(xué)習(xí)還請閱讀相關(guān)資料。
相關(guān)文章
Android波紋擴(kuò)散效果之仿支付寶咻一咻功能實現(xiàn)波紋擴(kuò)散特效
這篇文章主要介紹了Android波紋擴(kuò)散效果之仿支付寶咻一咻功能實現(xiàn)波紋擴(kuò)散特效的相關(guān)資料,需要的朋友可以參考下2016-02-02Android 數(shù)據(jù)庫SQLite 寫入SD卡的方法
如果手機(jī)沒有root,數(shù)據(jù)庫文件是無法查看到的,不方便調(diào)試。最好的辦法是把數(shù)據(jù)庫寫進(jìn)SD卡。通過本文給大家介紹Android 數(shù)據(jù)庫SQLite 寫入SD卡的方法,需要的朋友參考下吧2016-04-04android開發(fā)教程之獲取power_profile.xml文件的方法(android運行時能耗值)
在Android手機(jī)中,對于手機(jī)中的每個部件(cpu、led、gps、3g等等)運行時對應(yīng)的能耗值都放在power_profile.xml文件中2014-02-02解決Android Studio 代碼自動提示突然失效的問題
這篇文章主要介紹了解決Android Studio 代碼自動提示突然失效的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-03-03Android listview數(shù)據(jù)顯示及提示信息的實例
這篇文章主要介紹了Android listview數(shù)據(jù)顯示及提示信息的實例的相關(guān)資料,需要的朋友可以參考下2017-05-05Android中SeekBar和RatingBar用法實例分析
這篇文章主要介紹了Android中SeekBar和RatingBar用法,結(jié)合實例形式分析了SeekBar和RatingBar的功能、定義與簡單使用方法,需要的朋友可以參考下2016-06-06