Android開(kāi)發(fā)之Kotlin 探索

簡(jiǎn)介:

Kotlin 是一個(gè)基于 JVM 的新的編程語(yǔ)言钩杰,由 JetBrains 開(kāi)發(fā)纫塌。

Kotlin可以編譯成Java字節(jié)碼,也可以編譯成JavaScript讲弄,方便在沒(méi)有JVM的設(shè)備上運(yùn)行措左。

JetBrains,作為目前廣受歡迎的Java IDE IntelliJ 的提供商避除,在 Apache 許可下已經(jīng)開(kāi)源其Kotlin 編程語(yǔ)言怎披。

Kotlin已正式成為Android官方支持開(kāi)發(fā)語(yǔ)言胸嘁。

Google官網(wǎng)部分介紹:

If you're interested in using Kotlin, it's easy to get started because it works side by side with Java and C++ on Android. So you can keep your existing code, continue to use the various Android libraries, and incrementally add Kotlin code to your project. Unlike almost any other language, Kotlin is a drop-in replacement you can use bi-directionally—you can call into the Java language from Kotlin, and you can call into Kotlin from the Java language.

如果你對(duì)使用Kotlin感興趣,很容易開(kāi)始凉逛,因?yàn)樗贏ndroid上與Java和c++一起工作性宏。因此,您可以繼續(xù)使用現(xiàn)有的代碼状飞,繼續(xù)使用各種Android庫(kù)毫胜,并逐步將Kotlin代碼添加到項(xiàng)目中。與幾乎所有其他語(yǔ)言不同的是昔瞧,Kotlin是一個(gè)完全替代您可以使用雙向的替代方法——您可以從Kotlin調(diào)用Java語(yǔ)言指蚁,您可以從Java語(yǔ)言調(diào)用Kotlin。

Kotlin官網(wǎng)部分介紹:

Kotlin 非常適合開(kāi)發(fā) Android 應(yīng)用程序自晰,將現(xiàn)代語(yǔ)言的所有優(yōu)勢(shì)帶入 Android 平臺(tái)而不會(huì)引入任何新的限制:

  • 兼容性:Kotlin 與 JDK 6 完全兼容凝化,保障了 Kotlin 應(yīng)用程序可以在較舊的 Android 設(shè)備上運(yùn)行而無(wú)任何問(wèn)題。Kotlin 工具在 Android Studio 中會(huì)完全支持酬荞,并且兼容 Android 構(gòu)建系統(tǒng)搓劫。
  • 性能:由于非常相似的字節(jié)碼結(jié)構(gòu),Kotlin 應(yīng)用程序的運(yùn)行速度與 Java 類(lèi)似混巧。 隨著 Kotlin 對(duì)內(nèi)聯(lián)函數(shù)的支持枪向,使用 lambda 表達(dá)式的代碼通常比用 Java 寫(xiě)的代碼運(yùn)行得更快。
  • 互操作性:Kotlin 可與 Java 進(jìn)行 100% 的互操作咧党,允許在 Kotlin 應(yīng)用程序中使用所有現(xiàn)有的 Android 庫(kù) 秘蛔。這包括注解處理,所以數(shù)據(jù)綁定和 Dagger 也是一樣傍衡。
  • 占用:Kotlin 具有非常緊湊的運(yùn)行時(shí)庫(kù)深员,可以通過(guò)使用 ProGuard 進(jìn)一步減少。 在實(shí)際應(yīng)用程序中蛙埂,Kotlin 運(yùn)行時(shí)只增加幾百個(gè)方法以及 .apk 文件不到 100K 大小倦畅。
  • 編譯時(shí)長(zhǎng):Kotlin 支持高效的增量編譯,所以對(duì)于清理構(gòu)建會(huì)有額外的開(kāi)銷(xiāo)绣的,增量構(gòu)建通常與 Java 一樣快或者更快叠赐。
  • 學(xué)習(xí)曲線(xiàn):對(duì)于 Java 開(kāi)發(fā)人員,Kotlin 入門(mén)很容易屡江。包含在 Kotlin 插件中的自動(dòng) Java 到 Kotlin 的轉(zhuǎn)換器有助于邁出第一步芭概。Kotlin 心印 通過(guò)一系列互動(dòng)練習(xí)提供了語(yǔ)言主要功能的指南。

Kotlin從入門(mén)到上手

安裝使用
  • Android3.0以下的版本通過(guò) File | Settings | Plugins | Install JetBrains plugin… 搜索并安裝 Kotlin 插件惩嘉。
  • Android 3.0(preview)版本開(kāi)始已內(nèi)置安裝 Kotlin 插件谈山,可以直接使用開(kāi)發(fā)。
舊工程與新工程并存

使用kotlin開(kāi)發(fā)新工程與之前并無(wú)區(qū)別宏怔,創(chuàng)建一個(gè)新的工程奏路,只不過(guò)不再創(chuàng)建Java文件開(kāi)發(fā)畴椰,而是創(chuàng)建Kotlin文件,后綴為.kt

在舊工程上使用Kotlin開(kāi)發(fā)也是極為方便的鸽粉,我們可以把Java文件轉(zhuǎn)換為Kotlin文件斜脂,使用Code | Convert Java File to Kotlin File功能即可,或者使用Ctrl+Shift+Alt+K快捷鍵即可触机。Kotlin可以轉(zhuǎn)回Java嗎帚戳?這個(gè)是可以的,但是比較繁瑣儡首,而且我認(rèn)為這完全沒(méi)有必要片任。

  1. Menu>Tools>Kotlin>Show Kotlin Bytecode
  2. Click on the Decompile button
  3. Copy the java code

通過(guò)這個(gè)方法轉(zhuǎn)化得到的Java代碼比較low,而且不能很好的還原lambda表達(dá)式蔬胯。

Why Kotlin
  • 簡(jiǎn)潔对供,Kotlin大量的語(yǔ)法糖,讓我們使用更加方便快捷氛濒。
  • 安全产场,Java異常排行第一,跟NullPointerException說(shuō)再見(jiàn)舞竿。
  • 互操作性京景,可以使用JVM上的任何現(xiàn)有庫(kù),因?yàn)?00%的兼容性骗奖。
  • 工具友好确徙,Android studio 可以使用提示或者快捷鍵快速構(gòu)建你的代碼。

下面就小試牛刀执桌,光說(shuō)好我可不信服鄙皇。

還在findViewById?

private ImageView chooseImageView;

@Override
public void initView() {
    chooseImageView = (ImageView)findViewById(R.id.chooseImageView);
}

現(xiàn)在,我們可以什么都不用寫(xiě)就直接使用它鼻吮,Kotlin已經(jīng)幫我們做好了這部分工作。

使用Kotlin安卓擴(kuò)展:

apply plugin: 'kotlin-android-extensions'

僅僅需要導(dǎo)入指定的布局文件较鼓,就可以使用布局文件中所有的控件屬性:

import kotlinx.android.synthetic.main.<布局>.*
import kotlinx.android.synthetic.main.activity_main.*

@Override
public void initView() {
    textView.text = "Hello, Kotlin!"
    imageView.visibility = View.VISIBLE
}

沒(méi)錯(cuò)椎木,就是這么簡(jiǎn)單,直接用它的ID就可以使用它了博烂。

Get(),Set()太麻煩香椎?

在Kotlin中,定義變量的時(shí)候它就已經(jīng)封裝好了這兩個(gè)方法禽篱,常量則只有Get()方法畜伐。

class Hello{
    var text : String = "Hello Kotlin"
    val number = 1   
}

class Test{
    fun t{
        Hello().number //Get方法
        Hello().text = "New text" //Set方法
    }
}

lambda表達(dá)式

bt_log.setOnClickListener {
    // do something
}
window.addMouseListener(object : MouseAdapter() {
    override fun mouseClicked(e: MouseEvent) {
        // ...
    }

    override fun mouseEntered(e: MouseEvent) {
        // ...
    }
})

匿名對(duì)象只有一個(gè)方法和一個(gè)參數(shù)的話(huà)直接可以省略不寫(xiě),默認(rèn)參數(shù)為it躺率,多個(gè)參數(shù)則自己定義玛界,有多個(gè)方法的話(huà)則需要實(shí)現(xiàn)万矾。

集合的遍歷

HashMap<String, String> map = new HashMap<>();
map.put("1","a");
map.put("2","b")
map.put("3","c")
  
String str = "";
Iterator<Map.Entry> iterator = map.entrySet().iterator();
while (iterator.hasNext()){
   Map.Entry next = iterator.next();
   str += next.getKey() + "=" +next.getValue() + "\n";
}  
var map = mapOf("1" to "a","2" to "b","3" to "c")

var str = ""
for((k,v) in map){
    str = str + k + "=" + v + "\n"
}

對(duì)比一下Java和Kotlin的Map集合遍歷,沒(méi)錯(cuò)慎框,總是記不住的Map遍歷變得這么簡(jiǎn)單了良狈,只需要一行代碼即可:

for((k,v) in map),其中k和v就是Map的key和value了,你也可以隨便定義它笨枯。

空指針安全

var name: String? = null //該變量可能不會(huì)被賦值
var phone: String  

var nlength1 = name.length //提示錯(cuò)誤
var nlength2 = name?.length //正確 如果name沒(méi)有賦值是空的薪丁,則返回null,反之返回length

var plength1 = phone.length //提示錯(cuò)誤 phone沒(méi)有被賦值
phone = "18697723086"
var plength2 = phone.length //正確

變量類(lèi)型后面帶?表示該字段有可能為空,如果你沒(méi)有賦值就直接使用則編譯不通過(guò)馅精,會(huì)提示你它可能為空严嗜,

user?.base?.info?.name

當(dāng)然,也可以多級(jí)使用洲敢,如果其中有一個(gè)對(duì)象為空的話(huà)就直接返回null,不會(huì)報(bào)空啦漫玄。

相互調(diào)用

Java代碼和Kotlin代碼可以相互調(diào)用,調(diào)用起來(lái)也十分簡(jiǎn)單沦疾。

public class JavaStringUtils {
     public static boolean isEmpty(String str){
        return str!=null&&!str.equals("");
     }
  
  public static class TestUtil{
        public void testFun(){
            /**
             * java調(diào)用kotlin方法称近,方法的參數(shù)都得傳,因?yàn)閖ava中沒(méi)做處理
             */
            Utils.Companion.toast("調(diào)用了Java方法哮塞,其實(shí)Java方法又調(diào)用了kotlin方法",                             Toast.LENGTH_SHORT);
        }
    }
}
class Utils{
    /**
     * 伴生對(duì)象
     * Kotlin中沒(méi)有static靜態(tài)
     * Java類(lèi)中在其被加載的時(shí)候刨秆,靜態(tài)的變量已經(jīng)初始化了
     * Kotlin中則是分為實(shí)例變量和靜態(tài)變量?jī)深?lèi),Kotlin會(huì)將靜態(tài)的變量及方法打包在一個(gè)伴生類(lèi)中忆畅,即companion
     */
    companion object {
        /**
         * 吐司提示
         * toast("")
         * toast("",Toast.LENGTH_SHORT)
         * 默認(rèn)值可以不傳衡未,減少了方法的重載
         */
        fun toast(msg: String,length: Int = Toast.LENGTH_SHORT){
            Toast.makeText(App.application,msg,length).show()
        }

        fun log(tag: String = "ZZM",message: String){
            Log.d(tag,message)
        }
    }
}
//調(diào)用了Java的靜態(tài)方法
var isTrue = JavaStringUtils.isEmpty("true") //自動(dòng)推斷為Boolean類(lèi)型
if(isTrue){
   JavaStringUtils.TestUtil().testFun() //調(diào)用了Java的對(duì)象方法
}

看出來(lái)了吧,互相調(diào)用非常簡(jiǎn)單家凯,因?yàn)樗鼈兌际窍嗤ǖ幕捍祝詈闲?00%。

kotlin.jpg

上面的小例子寫(xiě)在Demo中绊诲,Demo地址戳我送粱,歡迎大家同我一起學(xué)習(xí)Kotlin并分享學(xué)習(xí)經(jīng)驗(yàn)啦。

以上只是一些初步探索掂之,更多開(kāi)發(fā)使用語(yǔ)法請(qǐng)參考Kotlin語(yǔ)言文檔

https://baike.baidu.com/item/Kotlin/1133714?fr=aladdin

https://developer.android.google.cn/kotlin/index.html

https://www.kotlincn.net/docs/reference/android-overview.html

https://www.kotlincn.net/docs/kotlin-docs.pdf

https://stackoverflow.com/questions/34957430/how-to-convert-a-kotlin-source-file-to-a-java-source-file

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末抗俄,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子世舰,更是在濱河造成了極大的恐慌动雹,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,110評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件跟压,死亡現(xiàn)場(chǎng)離奇詭異胰蝠,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,443評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)茸塞,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)躲庄,“玉大人,你說(shuō)我怎么就攤上這事翔横《刘危” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,474評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵禾唁,是天一觀(guān)的道長(zhǎng)效览。 經(jīng)常有香客問(wèn)我,道長(zhǎng)荡短,這世上最難降的妖魔是什么丐枉? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,881評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮掘托,結(jié)果婚禮上瘦锹,老公的妹妹穿的比我還像新娘。我一直安慰自己闪盔,他們只是感情好弯院,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,902評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著泪掀,像睡著了一般听绳。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上异赫,一...
    開(kāi)封第一講書(shū)人閱讀 51,698評(píng)論 1 305
  • 那天椅挣,我揣著相機(jī)與錄音,去河邊找鬼塔拳。 笑死鼠证,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的靠抑。 我是一名探鬼主播量九,決...
    沈念sama閱讀 40,418評(píng)論 3 419
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼颂碧!你這毒婦竟也來(lái)了荠列?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,332評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤稚伍,失蹤者是張志新(化名)和其女友劉穎弯予,沒(méi)想到半個(gè)月后戚宦,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體个曙,經(jīng)...
    沈念sama閱讀 45,796評(píng)論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,968評(píng)論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了垦搬。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片呼寸。...
    茶點(diǎn)故事閱讀 40,110評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖猴贰,靈堂內(nèi)的尸體忽然破棺而出对雪,到底是詐尸還是另有隱情,我是刑警寧澤米绕,帶...
    沈念sama閱讀 35,792評(píng)論 5 346
  • 正文 年R本政府宣布瑟捣,位于F島的核電站,受9級(jí)特大地震影響栅干,放射性物質(zhì)發(fā)生泄漏迈套。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,455評(píng)論 3 331
  • 文/蒙蒙 一碱鳞、第九天 我趴在偏房一處隱蔽的房頂上張望桑李。 院中可真熱鬧,春花似錦窿给、人聲如沸贵白。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,003評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)禁荒。三九已至,卻和暖如春允华,著一層夾襖步出監(jiān)牢的瞬間圈浇,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,130評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工靴寂, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留磷蜀,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,348評(píng)論 3 373
  • 正文 我出身青樓百炬,卻偏偏與公主長(zhǎng)得像褐隆,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子剖踊,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,047評(píng)論 2 355

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