Kotlin初步了解與嘗試

在前不久的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類。

目錄結(jié)構(gòu)

使用安卓模擬器可以正常啟動被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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市珊随,隨后出現(xiàn)的幾起案子述寡,更是在濱河造成了極大的恐慌,老刑警劉巖玫恳,帶你破解...
    沈念sama閱讀 211,948評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件辨赐,死亡現(xiàn)場離奇詭異,居然都是意外死亡京办,警方通過查閱死者的電腦和手機掀序,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,371評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來惭婿,“玉大人不恭,你說我怎么就攤上這事〔萍ⅲ” “怎么了换吧?”我有些...
    開封第一講書人閱讀 157,490評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長钥星。 經(jīng)常有香客問我沾瓦,道長,這世上最難降的妖魔是什么谦炒? 我笑而不...
    開封第一講書人閱讀 56,521評論 1 284
  • 正文 為了忘掉前任贯莺,我火速辦了婚禮,結(jié)果婚禮上宁改,老公的妹妹穿的比我還像新娘缕探。我一直安慰自己,他們只是感情好还蹲,可當我...
    茶點故事閱讀 65,627評論 6 386
  • 文/花漫 我一把揭開白布爹耗。 她就那樣靜靜地躺著耙考,像睡著了一般。 火紅的嫁衣襯著肌膚如雪潭兽。 梳的紋絲不亂的頭發(fā)上倦始,一...
    開封第一講書人閱讀 49,842評論 1 290
  • 那天,我揣著相機與錄音讼溺,去河邊找鬼楣号。 笑死,一個胖子當著我的面吹牛怒坯,可吹牛的內(nèi)容都是我干的炫狱。 我是一名探鬼主播,決...
    沈念sama閱讀 38,997評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼剔猿,長吁一口氣:“原來是場噩夢啊……” “哼视译!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起归敬,我...
    開封第一講書人閱讀 37,741評論 0 268
  • 序言:老撾萬榮一對情侶失蹤酷含,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后汪茧,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體椅亚,經(jīng)...
    沈念sama閱讀 44,203評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,534評論 2 327
  • 正文 我和宋清朗相戀三年舱污,在試婚紗的時候發(fā)現(xiàn)自己被綠了呀舔。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,673評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡扩灯,死狀恐怖媚赖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情珠插,我是刑警寧澤惧磺,帶...
    沈念sama閱讀 34,339評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站捻撑,受9級特大地震影響磨隘,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜顾患,卻給世界環(huán)境...
    茶點故事閱讀 39,955評論 3 313
  • 文/蒙蒙 一琳拭、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧描验,春花似錦、人聲如沸坑鱼。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,770評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至呼股,卻和暖如春耕魄,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背彭谁。 一陣腳步聲響...
    開封第一講書人閱讀 32,000評論 1 266
  • 我被黑心中介騙來泰國打工吸奴, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人缠局。 一個月前我還...
    沈念sama閱讀 46,394評論 2 360
  • 正文 我出身青樓则奥,卻偏偏與公主長得像,于是被迫代替她去往敵國和親狭园。 傳聞我的和親對象是個殘疾皇子读处,可洞房花燭夜當晚...
    茶點故事閱讀 43,562評論 2 349

推薦閱讀更多精彩內(nèi)容