在前不久的Google I/O keynote大會上尚蝌,Kotlin被安卓團隊宣布成為新的一級開發(fā)語言(first-class support for Kotlin)仑嗅,Kotlin官網(wǎng)的首頁應(yīng)景地在顯眼的地方添上了一行“Now Offcial in Android”祭芦,這則新聞也因此發(fā)酵為近日被熱情討論的一顆重磅炸彈您访。作為JetBrains公司開發(fā)的一個新式編程語言崎苗,我們平時在使用Intellj IDEA的過程中檩咱,便經(jīng)常可以見到Kotlin的身影驯绎,半年前開始年輕有為的周洲學弟也時不時向我們安利Kotlin語言的各種優(yōu)勢完慧。當然除此之外,得益于Kotlin基于JVM的特點剩失,一些“先驅(qū)者”們早在一兩年前就已將Kotlin投入到了JAVA/Android的實踐開發(fā)中屈尼。總之借此編寫博客的機會拴孤,我希望記錄一下對Kotlin這個正向前邁進的語言脾歧,粗淺的了解過程。
Kotlin是一種在JAVA虛擬機上可以運行的靜態(tài)類型編程語言乞巧,也可以被編譯為JavaScript源碼涨椒,它被設(shè)計為可以與JAVA代碼相互運作,甚至可以使用大量的現(xiàn)有JAVA類庫,得益于這個性質(zhì)蚕冬,作為一個新生的語言免猾,Kotlin就擁有了大量的高質(zhì)量類庫。Kotlin語法特點中囤热,有較為明顯的函數(shù)式編程的特征猎提,包括一些較為優(yōu)雅的LAMBDA表達式、自由的類型聲明與轉(zhuǎn)換等特性旁蔼,而不再受限于有時臃腫的完全面向?qū)ο蟮恼Z法锨苏,因此在比JAVA簡潔的同時,可以較好地兼容現(xiàn)有的JAVA語言與運行環(huán)境可能是他顯眼的優(yōu)點棺聊,被用于Android開發(fā)也印證了這一點(基于JAVA的安卓應(yīng)用編寫的代碼量還是比較多的)伞租。
下面借用Intellij IDEA的一些現(xiàn)有功能轉(zhuǎn)化一個現(xiàn)成的Android模板項目為Kotlin語言作為簡單的實驗。
首先在Intellj中創(chuàng)建一個新的Android模板項目限佩,修改項目的build.gradle文件葵诈,在buildscripts塊中添加記錄kotlin版本的全局變量與對kotlin的依賴:
buildscript {
ext.kotlin_version = '1.1.2-2'
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:2.2.2'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
Gradle是一款自動化構(gòu)建工具,在默認情況下Gradle會將目錄下的build.gradle文件作為當前項目的構(gòu)建文件祟同。其中buildscripts塊定義了全局的相關(guān)屬性作喘,ext.kotlin_version作用為聲明一個全局的可用變量記錄kotlin的版本號,因為其他地方會多次用到這個信息(版本號與Intellij的kotlin版本不一致會有提示)晕城;repositories定義倉庫泞坦,這里倉庫為jcenter;dependencies則為依賴關(guān)系砖顷,這里除了本身的android以外贰锁,我們需要添加一條對kotlin的依賴。
接下來則需要添加app模塊中的build.gradle中的相關(guān)配置信息:
apply plugin: 'kotlin-android'
android {
sourceSets {
main.java.srcDirs += 'src/main/kotlin'
}
}
dependencies {
compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
}
這里省去了一些已有的構(gòu)建信息滤蝠,主要是添加對Kotlin-android的依賴與將新的kotlin目錄增添至source目錄中李根。
配置好后可以利用IDEA自帶的功能(Android Studio應(yīng)該也有),使用Ctrl+Shift+Alt+K將android模板中的Activity類轉(zhuǎn)換為kotlin文件几睛,并移動至kotlin目錄中,注意保持包名一致粤攒。目錄結(jié)構(gòu)如下圖所森,java包中的LoginActivity為我備份的原本的java類。
使用安卓模擬器可以正常啟動被kt化的Activity:
這里的一個細節(jié)是夯接,需要將kt化后的onCreateLoader函數(shù)中的參數(shù)的Bundle后添上問號焕济,實現(xiàn)null-safe處理以免啟動時因為bundle值為null而拋出異常。(這里也可以看出自動化轉(zhuǎn)化的功能不一定是完美的)盔几。
截取一段被kt化后的Activity組件中的方法代碼如下:
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_login)
// Set up the login form.
mEmailView = findViewById(R.id.email) as AutoCompleteTextView
populateAutoComplete()
mPasswordView = findViewById(R.id.password) as EditText
mPasswordView!!.setOnEditorActionListener(TextView.OnEditorActionListener { textView, id, keyEvent ->
if (id == R.id.login || id == EditorInfo.IME_NULL) {
attemptLogin()
return@OnEditorActionListener true
}
false
})
val mEmailSignInButton = findViewById(R.id.email_sign_in_button) as Button
mEmailSignInButton.setOnClickListener { attemptLogin() }
mLoginFormView = findViewById(R.id.login_form)
mProgressView = findViewById(R.id.login_progress)
}
可以看到kotlin語言的特點晴弃,包括在參數(shù)/變量后添加問號實現(xiàn)null-safe(如果不為null正常執(zhí)行,若為null則返回null值,也可以設(shè)置缺省返回)上鞠;利用LAMBDA表達式實現(xiàn)匿名函數(shù)际邻,從而簡化代碼,避免java冗長的隱式內(nèi)部類的代碼編寫(當然JAVA8也引入了對LAMBDA表達式的支持)芍阎;代碼塊的最后一行可以作為整個塊的值世曾,如之前代碼中LAMBDA表達式最后的false語句;通過@OnEditorActionListener聲明返回值的定域……
除此之外谴咸,kotlin還支持if-else或when等語句作為右值進行編寫等函數(shù)式編程的優(yōu)勢特征轮听,但因為我剛剛接觸這個語言,暫時不能做出一些有效的總結(jié)岭佳,希望在之后的了解與學習中血巍,能對kotlin語言得到更多的理解與運用~
中間的配置過程參考自:https://zhuanlan.zhihu.com/p/27100220