[轉(zhuǎn)]Kotlin語言系統(tǒng)化學(xué)習(xí)K01-kotlin簡(jiǎn)介

文章轉(zhuǎn)載地址 http://www.reibang.com/p/c33128fb86dc
文章中有些內(nèi)容是借鑒《Kotlin實(shí)戰(zhàn)》中文版矿酵,特此注明一下斋攀。
Kotlin系統(tǒng)化學(xué)習(xí)系列文章(所有文章的鏈接)http://blog.csdn.net/ClAndEllen/article/details/77466628

K01-Kotlin簡(jiǎn)介

1.在學(xué)習(xí)之前,你應(yīng)該先遠(yuǎn)遠(yuǎn)觀望一下Kotlin語言

1.1 Kotlin與Java的一些關(guān)系和一些區(qū)別

首先Kotlin是針對(duì)Java平臺(tái)的一門新式編程語言,也是Android現(xiàn)在官方開發(fā)語言,Kotlin簡(jiǎn)潔,安全,可靠,最主要的是支持與Java的互操作游沿。而Java不得不說很強(qiáng)大,相信學(xué)習(xí)筆者這篇文章的同學(xué)肮砾,Java能力自然不會(huì)差诀黍。Kotlin能夠完美的使用Java當(dāng)中的各種框架,所以Kotlin的性能自然也不會(huì)差的仗处,反而某些方面做到很優(yōu)秀眯勾。每學(xué)習(xí)一個(gè)新的語言,那么第一個(gè)例子那絕對(duì)是"HelloWorld!",一下就是Kotlin語言"你好世界"的例子婆誓。

fun main(args: Array<String>) {

   println("HelloWorld吃环!--> 你好世界!")

}

1.2 Kotlin的特性(此處全部借鑒《Kotlin實(shí)戰(zhàn)》中文版)

1.2.1 目標(biāo)平臺(tái):服務(wù)器端洋幻,Android以及任何Java運(yùn)行的地方

Kotlin的首要目標(biāo)是提供一種更簡(jiǎn)潔郁轻,更高效,更安全的替代Java的語言,并且適用于現(xiàn)在所有的Java環(huán)境好唯。Java是一門非常受歡迎的語言竭沫,它廣泛的應(yīng)用于不同的環(huán)境中:小到智能卡(JavaCard技術(shù)),大到Google,Twitter,LinkedIn和其他這種規(guī)模的互聯(lián)網(wǎng)公司運(yùn)行的最大的數(shù)據(jù)中心骑篙。在這些地方蜕提,使用Kotlin可以幫助開發(fā)者在實(shí)現(xiàn)目標(biāo)的同時(shí)減少代碼并避免麻煩。??
Kotlin最長見的應(yīng)用場(chǎng)景有:??
(1).編寫服務(wù)器端代碼(典型的 代表是Web應(yīng)用后端)??
(2).創(chuàng)建Android設(shè)備上運(yùn)行的移動(dòng)應(yīng)用??
但Kotlin還有其他的用武之地靶端。例如谎势,可以使用Intel Multi-OS Engine讓Kotlin代碼運(yùn)行在IOS設(shè)備上。還可以使用Kotlin和TornadoFX以及JavaFX(Getting Started with JavaFX,Oracle,http://mng.bz/500y)一起來構(gòu)建桌面應(yīng)用程序杨名。?
?除了Java之外脏榆,Kotlin還可以編譯成JavaScript,允許你在瀏覽器中運(yùn)行Kotlin代碼。Kotlin的目標(biāo)平臺(tái)是相當(dāng)廣泛的台谍。Kotlin并沒有被限制在單一的問題領(lǐng)须喂,也沒有被限制在解決軟件開發(fā)者面臨的某一類型的挑戰(zhàn)。相反典唇,對(duì)所有開發(fā)過程中涌現(xiàn)的任務(wù)镊折,Kotlin都提供了全面的生產(chǎn)力提升胯府。它借助支持特定領(lǐng)域或編程范式的庫介衔,提供了卓越的集成水準(zhǔn)。

1.2.2 靜態(tài)類型

Kotlin和Java一樣是一種靜態(tài)類型的編程語言骂因。這意味著所有表達(dá)式的類型在編譯期已經(jīng)確定了炎咖,而編譯器就能驗(yàn)證對(duì)象是否包含了你想訪問的方法或者字段。
這與動(dòng)態(tài)類型的編程語言形成了鮮明的對(duì)比寒波,后者在JVM上的代表包括Groovy和JRuby乘盼。這些語言允許你定義可以存儲(chǔ)任何數(shù)據(jù)類型和變量,或者返回任何數(shù)據(jù)類型的函數(shù)俄烁,并在運(yùn)行期時(shí)才解析方法和字段引用绸栅。這會(huì)減少代碼質(zhì)量并增加創(chuàng)建數(shù)據(jù)結(jié)構(gòu)的靈活性。但它的特點(diǎn)是页屠,在編譯期間不能發(fā)現(xiàn)像名字拼寫錯(cuò)誤這樣的問題粹胯,繼而導(dǎo)致運(yùn)行時(shí)的錯(cuò)誤。

另一方面辰企,與Java不同的是风纠,Kotlin不需要你在源代碼中顯式地聲明每個(gè)變量的類型。很多情況下牢贸,變量類型可以根據(jù)上下文來自動(dòng)判斷竹观,這樣就可以省去類型的聲明。這里有一個(gè)可能最簡(jiǎn)單的例子:

val x = 1

在聲明這個(gè)變量時(shí),由于變量初始化為整數(shù)值臭增,Kotlin自動(dòng)判斷它的類型是Int,編譯器這種從上下文推斷類型變量的能力被稱作類型推導(dǎo)懂酱。??
下面羅列了一些靜態(tài)類型帶來的好處:??
性能---方法調(diào)用速度更快,因?yàn)椴恍枰谶\(yùn)行時(shí)來判斷調(diào)用的是哪個(gè)方法速址。??
可靠性---編譯器驗(yàn)證了程序的正確性玩焰,因而運(yùn)行時(shí)崩潰的概率更低。
??可維護(hù)性---陌生代碼更容易維護(hù)芍锚,因?yàn)槟憧梢钥吹酱a中用到的對(duì)象的類 型昔园。
??工具支持---靜態(tài)類型使IDE能提供可靠的重構(gòu),精確的代碼補(bǔ)全以及其他特性并炮。
得益于Kotlin對(duì)類型推導(dǎo)的支持默刚,你不再需要顯式的聲明類型,因此大部分關(guān)于靜態(tài)類型的額外冗長代碼也就不復(fù)存在了逃魄。??
當(dāng)你檢視Kotlin類型系統(tǒng)的細(xì)節(jié)時(shí)荤西,你會(huì)發(fā)現(xiàn)許多熟悉的概念。類伍俘,接口以及泛型和Java非常接近邪锌,所以大部分的Java知識(shí)可以很容易地轉(zhuǎn)移到Kotlin。然而癌瘾,也會(huì)有一些新概念出現(xiàn)觅丰。
??其中最重要的是Kotlin對(duì)可空類型的支持,通過在編譯期間檢測(cè)可能存在的空指針異常妨退,它讓你可以寫出更可靠的程序妇萄。本章最后面我們將回顧可空類型,并在之后的文章中進(jìn)行詳細(xì)討論咬荷。
??另外一個(gè)Kotlin類型系統(tǒng)的新概念是對(duì)函數(shù)類型的支持冠句。要搞清這一點(diǎn),我們先要了解函數(shù)式編程的主要思想幸乒,以及Kotlin是如何支持這種編程風(fēng)格的懦底。

1.2.3 函數(shù)式與面向?qū)ο?/h2>

作為一個(gè)Java開發(fā)者,你一定對(duì)面向?qū)ο缶幊痰暮诵母拍顮€熟于胸罕扎,但函數(shù)式編程對(duì)你來說卻可能很新鮮聚唐。函數(shù)式編程的核心概念如下:
??頭等函數(shù)---把函數(shù)(一小段行為)當(dāng)作值使用,可以用變量保存它壳影,把它當(dāng)參數(shù)傳遞拱层,或者當(dāng)作其他函數(shù)的返回值。
??不可變性---使用不可變對(duì)象宴咧,這保證了它們的狀態(tài)在其創(chuàng)建之后不再變化根灯。
??無副作用---使用的是純函數(shù)。此函數(shù)在輸入相同時(shí)會(huì)產(chǎn)生同樣的結(jié)果,并且不會(huì)修改其他對(duì)象的狀態(tài)烙肺,也不會(huì)和外面的世界交互纳猪。
函數(shù)式編程風(fēng)格的代碼能給你帶來什么好處?
首先桃笙,簡(jiǎn)潔氏堤。函數(shù)式風(fēng)格的代碼比相應(yīng)的命令式風(fēng)格的代碼更優(yōu)雅,更簡(jiǎn)練搏明。因?yàn)榘押瘮?shù)當(dāng)作值可以讓你獲得更強(qiáng)大的抽線的能力鼠锈,從而避免重復(fù)代碼。
??假設(shè)你有兩段類似的代碼星著,實(shí)現(xiàn)相似的任務(wù)(例如:在集合中尋找一個(gè)匹配的元素)但具體細(xì)節(jié)略有不同(如何判斷元素是匹配的)购笆。可以輕易地將邏輯中公共的部分提取到一個(gè)函數(shù)中虚循,并將其他不同的部分作為參數(shù)傳遞給它同欠。這些參數(shù)本身也是函數(shù),但你可以使用一種簡(jiǎn)潔的語法來表示這些匿名的函數(shù)横缔,它被稱作為Lambda表達(dá)式:


函數(shù)式編程風(fēng)格的代碼帶來的第二個(gè)好處就是多線程安全铺遂。多線程程序中最大的錯(cuò)誤來源之一就是,在沒有采用適當(dāng)同步機(jī)制的情況下茎刚,在不同的線程上修改同一份數(shù)據(jù)襟锐。如果你使用的不是不可變數(shù)據(jù)結(jié)構(gòu)和純函數(shù),就能保證這樣不安全的修改根本不會(huì)發(fā)生斗蒋,也就不需要考慮為其設(shè)計(jì)復(fù)雜的同步方案捌斧。
??最后笛质,函數(shù)式編程風(fēng)格可以在任何編程語言中使用(包括Java),它的很多主張都被認(rèn)為是良好的編程風(fēng)格泉沾。然而并不是所有的語言都提供了語法和庫支持,讓我們可以不費(fèi)力地使用這種風(fēng)格妇押。例如:Java8之前的Java版本都缺少了這種支持跷究。
Kotlin擁有豐富的特性集從一開始就支持函數(shù)式編程風(fēng)格,包括:
??(1)函數(shù)類型敲霍,允許函數(shù)接受其他函數(shù)作為參數(shù)俊马,或者返回其他函數(shù)。
??(2)Lambda表達(dá)式肩杈,讓你用最少的樣板代碼方便地傳遞代碼塊柴我。
??(3)數(shù)據(jù)類,提供了創(chuàng)建不可變值對(duì)象的簡(jiǎn)明語法扩然。
??(4)標(biāo)準(zhǔn)庫中包括了豐富的API集合艘儒,讓你用函數(shù)式編程風(fēng)格操作對(duì)象和集合。
??Kotlin允許你使用函數(shù)式編程風(fēng)格但并沒有強(qiáng)制你使用它。當(dāng)你需要的時(shí)候界睁,可以使用可變數(shù)據(jù)觉增,也可以編寫帶副作用的函數(shù),而且不需要跳過任何多余的步驟翻斟。然而逾礁,毫無疑問的是,在Kotlin中使用基于接口和類層次結(jié)構(gòu)的庫就像Java一樣簡(jiǎn)單访惜。當(dāng)編寫Kotlin代碼的時(shí)候嘹履,可以結(jié)合使用面向?qū)ο缶幊毯秃瘮?shù)式編程風(fēng)格,并使用最合適的工具來對(duì)付亟(ji,念第2聲)待解決的問題债热。

1.2.4 免費(fèi)并開源

Kotlin語言(包括編譯器植捎,庫和所有相關(guān)工具)是完全開源的,并且可以自由使用阳柔。它采用Apache2許可證焰枢;其開發(fā)過程完全公開在GitHub上,并且歡迎來自社區(qū)的貢獻(xiàn)舌剂。如果你要開發(fā)Kotlin應(yīng)用程序济锄,有三種開源供你選擇:
IntelliJ IDEA Community2版,Android Studio以及Eclipse霍转,它們都完全支持Kotlin(當(dāng)然荐绝,IntelliJ IDEA Ultimate 也支持Kotlin)。??現(xiàn)在你明白了Kotlin是什么語言避消,讓我們看看Kotlin在具體的實(shí)際應(yīng)用中會(huì)給你帶來哪些好處低滩。

1.3 Kotlin應(yīng)用(此處全部借鑒《Kotlin實(shí)戰(zhàn)》中文版)

如前所述,Kotlin使用的兩個(gè)主要的領(lǐng)域是服務(wù)器端和Android開發(fā)岩喷。接下來我們分別看看這兩個(gè)領(lǐng)域恕沫,以及為什么Kotlin非常適合它們。

1.3.1 服務(wù)器端的Kotlin

服務(wù)器端編程是一個(gè)非常大的概念纱意,它包含了所有下列的應(yīng)用程序類型甚至更多:
??(1)返回HTML頁面給瀏覽器的Web應(yīng)用程序婶溯。
??(2)通過HTTP暴露JSON API的移動(dòng)應(yīng)用后端服務(wù)。
??(3)通過RPC協(xié)議互相通信的微服務(wù)偷霉。
??多年以來迄委,開發(fā)者一直在構(gòu)建這些類型的應(yīng)用,并且積累了大量的框架和技術(shù)來幫助他們構(gòu)建這些應(yīng)用类少。這些應(yīng)用并不是孤立地開發(fā)或者從零開始的叙身,它們幾乎總是對(duì)現(xiàn)有的系統(tǒng)進(jìn)行擴(kuò)展,改進(jìn)或者替換硫狞,新的代碼必須和系統(tǒng)中現(xiàn)有部分進(jìn)行集成信轿,而這些部分可能很多年之前就寫成了赞警。
??這種環(huán)境下Kotlin的一大優(yōu)勢(shì)就是它們與現(xiàn)有的Java代碼的無縫的互操作性。無論是要編寫一個(gè)全新的控件還是移植一個(gè)現(xiàn)有服務(wù)的代碼虏两,Kotlin都毫無壓力愧旦。不管你需要在Kotlin中繼承Java類,還是1以某種方式注解一個(gè)類的方法和字段定罢,都不會(huì)遇到任何問題笤虫。它帶來的優(yōu)點(diǎn)是系統(tǒng)的代碼更加緊湊,更可靠祖凫,更易于維護(hù)琼蚯。
??與此同時(shí),Kotlin還引入許多用于開發(fā)這類系統(tǒng)的新技術(shù)惠况。例如遭庶,對(duì)構(gòu)建器模式的支持讓你可以使用更簡(jiǎn)潔的語法來創(chuàng)建任何對(duì)象圖,同時(shí)保留了語言中全套的抽象機(jī)制和代碼重用工具稠屠。
??這個(gè)特性的一個(gè)最簡(jiǎn)單的用例就是HTML生成庫峦睡,它可以把一個(gè)外部模版語言替換成簡(jiǎn)潔且完全類型安全的解決方案。這里有一個(gè)例子:


可以輕松地把映射到HTML標(biāo)簽的函數(shù)和常規(guī)的Kotlin語言結(jié)構(gòu)組合起來权埠。你不再需要使用一門獨(dú)立的模版語言榨了,也不需要學(xué)習(xí)新的語法,僅僅使用循環(huán)就可以生成HTML頁面攘蔽。
??另外一個(gè)能用上Kotlin干凈和簡(jiǎn)潔的DSL的用例是持久化框架龙屉。例如,Exposed框架(https://github.com/jetbrains/exposed)就提供了易讀的DSL,可以完全使用Kotlin代碼來描述SQL數(shù)據(jù)庫的結(jié)構(gòu)并執(zhí)行查詢操作满俗,并且有全面的類型檢查转捕。下面這個(gè)小例子展示了可行的做法:

1.3.2 Android上的Kotlin

一個(gè)典型的移動(dòng)應(yīng)用和一個(gè)典型的企業(yè)應(yīng)用完全不同。它更小唆垃,更少地依賴與現(xiàn)有的代碼集成五芝,通常需要快速交付,同時(shí)需要保證在大量的設(shè)備上能夠可靠地運(yùn)行降盹。這類項(xiàng)目Kotlin也能勝任与柑。
??Kotlin的語言特征谤辜,加上支持Android框架的特殊編譯器插件蓄坏,讓Android的開發(fā)體驗(yàn)變得高效和愉悅,常見的開發(fā)任務(wù)丑念,比如給控件添加監(jiān)控器或者把布局元素綁定到字段涡戳,可以用更少的代碼完成,有時(shí)甚至根本不用寫任何代碼(編譯器會(huì)幫你生成)脯倚。同樣由Kotlin團(tuán)隊(duì)打造的庫Anko(https://github.com/Kotlin/anko)給許多標(biāo)準(zhǔn)Android API添加了Kotlin友好的適配器渔彰,進(jìn)一步提升了Android的開發(fā)體驗(yàn)嵌屎。
??下面是Anko的一個(gè)簡(jiǎn)單例子,可以品嘗到使用Kotlin進(jìn)行Android開發(fā)的滋味恍涂。只要把這段代碼放在一個(gè)Activity中宝惰,一個(gè)簡(jiǎn)單的Android應(yīng)用就做好了!

使用Kotlin帶來的另一優(yōu)勢(shì)就是更好的應(yīng)用可靠性再沧。如果你有開發(fā)Android應(yīng)用的經(jīng)驗(yàn)尼夺,你一定對(duì)"Unfortunately,Process Has Stopped"對(duì)話框深惡痛絕。如果你的應(yīng)用有未處理的異常炒瘸,這個(gè)對(duì)話框就會(huì)出現(xiàn)淤堵,而這種異常一般是NullPointException(空指針異常)。Kotlin的類型系統(tǒng)通過精確地跟蹤null值顷扩,大大減輕了空指針異常問題帶來的壓力拐邪。大部分Java中會(huì)導(dǎo)致NullPointException的代碼在Kotlin中無法編譯成功,以確保這些錯(cuò)誤在應(yīng)用到達(dá)用戶手中之前得到修正隘截。
??同時(shí)扎阶,由于Kotlin完全兼容Java6,使用它并不會(huì)帶來任何新的編譯問題。你可以享受所有的Kotlin的炫酷新特性婶芭,而你的用戶仍然可以在它們的設(shè)備上使用你的應(yīng)用乘陪,即使他們的設(shè)備并沒有運(yùn)行最新版本的Android系統(tǒng)阶祭。
??說到性能泽铛,Kotlin也沒有帶來任何負(fù)面影響。Kotlin編譯器生成的代碼執(zhí)行起來和普通的Java代碼效率一樣昂勒。Kotlin使用的運(yùn)行時(shí)(庫)體積相當(dāng)小井赌,所以編譯出來的應(yīng)用程序包體積也不會(huì)增加多少谤逼。當(dāng)你使用Lambda的時(shí)候,它們會(huì)被許多Kotlin標(biāo)準(zhǔn)庫函數(shù)內(nèi)聯(lián)仇穗,Lambda的內(nèi)聯(lián)確保不會(huì)創(chuàng)建新對(duì)象流部,因此應(yīng)用程序也不必忍受額外的GC暫停。
??看過了和Java相比Kotlin的優(yōu)勢(shì)之后纹坐,我們?cè)賮砜纯碖otlin的設(shè)計(jì)哲學(xué)---那些把Kotlin和其他面向JVM的現(xiàn)代語言區(qū)分開的主要特性枝冀。1.4 Kotlin的設(shè)計(jì)哲學(xué)(此處全部借鑒《Kotlin實(shí)戰(zhàn)》中文版)
??當(dāng)談起Kotlin的時(shí)候,我們喜歡說它是一門務(wù)實(shí)耘子,簡(jiǎn)潔和安全的語言果漾,專注于互操作性。這里的每個(gè)詞語究竟是什么含義谷誓?我們逐個(gè)來看看绒障。

1.4.1 務(wù)實(shí)

務(wù)實(shí)對(duì)我們來說意味著一件簡(jiǎn)單的事情:Kotlin就是一門設(shè)計(jì)出來解決現(xiàn)實(shí)世界問題的實(shí)用語言。它的設(shè)計(jì)基于多年創(chuàng)建大型系統(tǒng)的工業(yè)經(jīng)驗(yàn)捍歪,它的特性也是為解決許多軟件開發(fā)者遇到的場(chǎng)景而選擇的户辱。此外鸵钝,來自JetBrains內(nèi)部和社區(qū)的開發(fā)這已經(jīng)使用Kotlin的早期版本很多年,他們的反饋也被融合進(jìn)了這門語言公開發(fā)布的版本中庐镐。所以我們才能自信的說恩商,Kotlin能夠幫助解決實(shí)際項(xiàng)目的問題。
??Kotlin也不是一門研究性的語言必逆。我們沒有試圖提升編程語言設(shè)計(jì)領(lǐng)域目前的技術(shù)水平痕届,也沒有嘗試探索計(jì)算機(jī)科學(xué)的創(chuàng)新理念。反而末患,我們會(huì)盡可能地依賴已經(jīng)出現(xiàn)在其他編程語言中并被證明是成功的那些特性和解決方案研叫。這降低了語言的復(fù)雜性,也讓它更容易學(xué)習(xí)璧针,因?yàn)槟憧梢匝稣棠切┦煜さ母拍睢?br> ??此外嚷炉,Kotlin也沒有強(qiáng)制使用某種特定的編程風(fēng)格和范式。當(dāng)你開始學(xué)習(xí)這門語言的時(shí)候探橱,可以使用熟悉的來自Java經(jīng)驗(yàn)的風(fēng)格申屹。然后,你會(huì)漸漸地發(fā)現(xiàn)更多強(qiáng)大的Kotlin特性隧膏,并學(xué)習(xí)把它們應(yīng)用到你的代碼中哗讥,讓代碼更簡(jiǎn)潔,更符合語言習(xí)慣胞枕。
??Kotlin的使用主義的另外一個(gè)重要體現(xiàn)是對(duì)于工具的專注杆煞。對(duì)開發(fā)者的生產(chǎn)力而言,一個(gè)智能的開發(fā)環(huán)境和一門設(shè)計(jì)良好的語言同樣重要腐泻。因此决乎,事后再來考慮對(duì)IDE進(jìn)行支持就是馬后炮。而Kotlin的情況是派桩,IntelliJ IDEA的插件是和編譯器同步開發(fā)的构诚,并且在設(shè)計(jì)語言特性時(shí)始終牢記著對(duì)工具的支持。
??IDE支持對(duì)幫助你探索Kotlin的特性也發(fā)揮著重要作用铆惑。許多情況下范嘱,工具會(huì)發(fā)現(xiàn)那些可以用更簡(jiǎn)潔的結(jié)構(gòu)來替換的通用代碼模式,并給你提供修正這些代碼的選擇员魏。通過研究自動(dòng)修正所使用的語言特性丑蛤,你就能學(xué)習(xí)如何在自己的代碼中應(yīng)用這些特性。
1.4.2 簡(jiǎn)潔
??和編寫新代碼相比逆趋,開發(fā)人員會(huì)耗費(fèi)更多的時(shí)間來閱讀現(xiàn)有的代碼盏阶,這已經(jīng)是常識(shí)。想象一下你所在的團(tuán)隊(duì)正在開發(fā)一個(gè)大項(xiàng)目闻书,而你的工作是添加一個(gè)新特性或者修改bug名斟。第一步會(huì)干什么?首先要找到需要改變的那段代碼魄眉,然后才能實(shí)現(xiàn)你的修改砰盐。要閱讀很多代碼才能知道你要做什么。這些代碼可能最近剛完成坑律,由你的同事或者是那些已經(jīng)離開的同事編寫岩梳,或者是你自己很久之前寫好的。只有搞懂了周圍的代碼你才能做出正確的改動(dòng)晃择。
??代碼越簡(jiǎn)單越簡(jiǎn)潔冀值,你就能越快地了解發(fā)生了什么。當(dāng)然宫屠,良好的設(shè)計(jì)和達(dá)意的命名在這里起著重要的作用列疗。但語言的選擇及其簡(jiǎn)潔也很重要。如果語言的語法清晰地表達(dá)了被閱讀的代碼的意圖浪蹂,沒有因?yàn)檫_(dá)成意圖所需的樣板代碼而晦澀難懂抵栈,那么它是簡(jiǎn)潔的。
??在Kotlin中坤次,我們努力地保證你寫的代碼都具有實(shí)際的意義古劲,而不是僅僅為了滿足代碼結(jié)構(gòu)的需要。許多標(biāo)準(zhǔn)的Java樣板代碼缰猴,例如:getter,setter以及將構(gòu)造方法的參數(shù)賦值給字段的邏輯产艾,在Kotlin中都是隱式的,并不會(huì)是你的源代碼變得混亂滑绒。
??另外一個(gè)導(dǎo)致代碼變得不必要的冗長的原因是編程顯式的代碼來完成常見的任務(wù)胰舆,比如定位集合中的元素。和許多其他現(xiàn)代語言一樣蹬挤,Kotlin有豐富的標(biāo)準(zhǔn)庫缚窿,讓你用庫方法調(diào)用來代替這些冗長重復(fù)的代碼段。Kotlin對(duì)Lambda表達(dá)式得到支持焰扳,讓小代碼塊可以輕松地傳遞給庫函數(shù)倦零。這讓你可以把公共的那部分代碼全部封裝在庫中,而在用戶代碼中僅保留特定的針對(duì)任務(wù)的那部分吨悍。
??與此同時(shí)扫茅,Kotlin并沒有嘗試把源代碼壓縮到最小可能的長度。例如育瓜,即使Kotlin支持運(yùn)算符重載葫隙,用戶也不能定義自己的運(yùn)算符。因此躏仇,庫開發(fā)者不能用神秘的標(biāo)點(diǎn)符號(hào)序列來代替方法名字恋脚。單詞比標(biāo)點(diǎn)符號(hào)顯然更易懂腺办,也更容易找到相關(guān)的文檔。
??越簡(jiǎn)潔的代碼寫起來花的時(shí)間越短糟描,更重要的是怀喉,談起來耗費(fèi)的時(shí)間也更短。這回提高你的生產(chǎn)力并讓你更快地達(dá)成目標(biāo)船响。
1.4.3 安全
??通常躬拢,我們說這一門編程語言是安全的,我們的意思是它的設(shè)計(jì)可以防止程序出現(xiàn)某些類型的錯(cuò)誤见间。當(dāng)然聊闯,這并不意味這絕對(duì)的高質(zhì)量,沒有任何語言可以阻止所有可能出現(xiàn)的錯(cuò)誤米诉。此外菱蔬,預(yù)防錯(cuò)誤是需要成本的。需要給編譯器提供程序有預(yù)期操作更多的信息荒辕,這樣編譯器才能驗(yàn)證這些信息是否和程序的功能匹配汗销。因此,你要在得到的安全級(jí)別和因?yàn)樵黾痈嗉?xì)節(jié)注解而造成的生產(chǎn)力損失之間權(quán)衡權(quán)弊抵窒。
??使用Kotlin,我們?cè)噲D實(shí)現(xiàn)比Java更高的安全級(jí)別弛针,同時(shí)保持更低的總體成本。在JVM上運(yùn)行已經(jīng)提供了許多的安全保證:例如李皇,內(nèi)存安全削茁,防止了緩沖區(qū)溢出以及其他錯(cuò)誤的動(dòng)態(tài)內(nèi)存分配造成的問題。作為面向JVM的靜態(tài)類型語言掉房,Kotlin還保證了應(yīng)用程序的類型安全茧跋。這比使用使用Java的成本要更低:不需要指定所有的類型聲明,因?yàn)樵S多情況下編譯器會(huì)自動(dòng)地推斷出類型卓囚。
??Kotlin所做的不止這些瘾杭,這意味著更多的原本在運(yùn)行時(shí)失敗的錯(cuò)誤在編譯期的檢查中就被阻止了。最重要的一點(diǎn)是哪亿,Kotlin努力地從你的程序中消除NullPointException粥烁。Kotlin的類型系統(tǒng)跟蹤那些可以或不可以為null的值,并且禁止那些運(yùn)行時(shí)可能導(dǎo)致NullPointException的操作蝇棉。這所帶來的額外的成本是極小的:把類型標(biāo)記為空的只要一個(gè)字符讨阻,就是類型尾部的一個(gè)問號(hào):
val s1 String? = null//可為空的Stringval s2 String = ""http://不可為空的String

除此之外,Kotlin提供了許多便利的方法來處理可空數(shù)據(jù)篡殷。這非常有助于消滅應(yīng)用程序的崩潰钝吮。??Kotlin有助于避免的另一種異常類型就是ClassCastException。當(dāng)你把一個(gè)對(duì)象轉(zhuǎn)換成一種類型,而沒有事先檢查它是否是正確的類型時(shí)奇瘦,就會(huì)發(fā)生這個(gè)異常棘催。在Java中,開發(fā)者常常省略了這類檢查链患,因?yàn)楸仨毞磸?fù)地在檢查和其后的轉(zhuǎn)換中寫明類型名稱巧鸭。另一方面瓶您,Kotlin中的檢查和轉(zhuǎn)換組合成了一次操作:一旦檢查過類型麻捻,不需要額外的轉(zhuǎn)換就能直接引用屬于這個(gè)類型的成員。這樣呀袱,開發(fā)者就沒有借口跳過檢查贸毕,也不會(huì)給錯(cuò)誤留下可乘之機(jī)。下面展示了它是如何工作的:
if(value is string) //檢查類型的異常 println(value.toUpperCase()) //調(diào)用該類型的方法

1.4.4 互操作性

關(guān)于互操作性夜赵,你的第一問題可能是:“我是不是可以繼續(xù)使用現(xiàn)有的庫?”Kotlin給出的回答是:“當(dāng)然可以明棍。”無論需要使用哪種庫提供的API,都可以在Kotlin中使用它們寇僧√福可以調(diào)用Java的方法,繼承Java的類和實(shí)現(xiàn)Java的接口嘁傀,在Kotlin類上應(yīng)用Java的注解兴蒸,等等。
??與其他一些JVM語言不同细办,Kotlin在互操作上更上一層樓橙凳,讓Java代碼也可以毫不費(fèi)力地調(diào)用Kotlin的代碼。無須取巧:Kotlin的類和方法可以像常規(guī)的Java類和方法一樣被調(diào)用笑撞。這帶來了無限的靈活性岛啸,在項(xiàng)目的任何地方都可以混合使用Java和Kotlin。當(dāng)你剛開始在自己的Java項(xiàng)目中引入Kotlin時(shí)茴肥,可以在代碼庫的任意一個(gè)類上運(yùn)行Java和Kotlin的轉(zhuǎn)換器坚踩,剩下的代碼不需要任何修改就可以繼續(xù)編譯和工作。不管你所轉(zhuǎn)換的類是什么角色瓤狐,這都是可行的瞬铸。
??另一個(gè)Kotlin專注與互操作性的領(lǐng)域是在最大程度上使用現(xiàn)有的Java庫。例如芬首,Kotlin沒有自己的集合庫赴捞,它完全依賴Java標(biāo)準(zhǔn)庫中的類,使用額外的函數(shù)來擴(kuò)展它們郁稍,讓它們?cè)贙otlin中用起來更方便赦政。這意味著在Kotlin中調(diào)用JavaAPI時(shí),永遠(yuǎn)不需要包裝或者轉(zhuǎn)換這些Java對(duì)象,反之亦然恢着。所有這些Kotlin提供的豐富的API在運(yùn)行時(shí)沒有任何的額外開銷桐愉。
??Kotlin工具也對(duì)跨語言項(xiàng)目提供了全面支持。它可以編譯任意混合的Java和Kotlin源碼掰派,不管它們之間是怎樣互相依賴的从诲。IDE的特性也能跨語言工作,允許:
??(1)自由地在Java和Kotlin源碼文件之間切換靡羡。
??(2)調(diào)試混合語言的項(xiàng)目系洛,可以在不同語言編寫代碼之中單步調(diào)試。
??(3)重構(gòu)Java方法的時(shí)候略步,Kotlin代碼中的對(duì)它們的調(diào)用也會(huì)得到正確的更新描扯,反之亦然。
??希望我們已經(jīng)說服你嘗試一下Kotlin,現(xiàn)在趟薄,你要如何開始使用它绽诚?在接下來的一節(jié)中,我們將從命令行和其他不同工具的使用兩方面討論和運(yùn)行Kotlin代碼的過程杭煎。

1.5 使用Kotlin工具(此處全部借鑒《Kotlin實(shí)戰(zhàn)》中文版)

和Java一樣恩够,Kotlin也是編譯型語言,這意味著你必須先編譯羡铲,然后才能執(zhí)行Kotlin代碼蜂桶。讓我們來討論一下編譯過程,然后看看幫助你完成這個(gè)過程需要的不同工具犀勒。如果你需要關(guān)于如何搭建開發(fā)環(huán)境的信息屎飘,請(qǐng)參考Kotlin官方網(wǎng)站的“Tutorials”(教程)一節(jié)(https://kotlinlang.org/docs/tutorials)。

1.5.1 編譯Kotlin代碼

Kotlin的源代碼存放在后綴名為.kt的文件中贾费。Kotlin編譯器會(huì)分析源代碼并生成.class文件钦购,這和Java編譯器做的沒什么不同。然后按照你正在處理的應(yīng)用程序類型的標(biāo)準(zhǔn)過程打包和執(zhí)行生成的.class文件褂萧。最簡(jiǎn)單的情況下押桃,只需要使用kotlinc命令就可以從命令行編譯代碼,然后就可以用Java命令執(zhí)行你的代碼:
kotlinc <source file or directory> -include-runtime -d <jar name> java -jar <jar name>

圖1.1展示了Kotlin構(gòu)建過程的簡(jiǎn)單描述导犹。


用Kotlin編譯器的代碼依賴Kotlin運(yùn)行時(shí)庫唱凯。它包括了Kotlin自己的標(biāo)準(zhǔn)庫類的定義,以及Kotlin對(duì)標(biāo)準(zhǔn)Java API的擴(kuò)展谎痢。運(yùn)行時(shí)庫需要和你的應(yīng)用程序一起分發(fā)磕昼。
??在大多數(shù)實(shí)際工作的例子中,你會(huì)使用像Maven,Gradle或者這樣的構(gòu)建系統(tǒng)來編譯你的代碼节猿。Kotlin和所有這些構(gòu)建系統(tǒng)都兼容票从,我們會(huì)在附錄A中討論相關(guān)細(xì)節(jié)漫雕。所有這些構(gòu)建系統(tǒng)也支持在同一代碼庫中既有Kotlin也有Java的混合語言項(xiàng)目。此外峰鄙,Maven和Gradle還會(huì)幫你把Kotlin運(yùn)行時(shí)庫作為依賴加入到你的應(yīng)用程序中浸间。1.5.2 IntelliJ IDEA 和 Android Studio 插件
??IntelliJ IDEA的Kotlin插件和語言同步開發(fā)的,它是Kotlin可用的功能最全面的開發(fā)環(huán)境吟榴。它成熟且穩(wěn)定魁蒜,提供了Kotlin開發(fā)所需的全套工具。
??IntelliJ IDEA 15及其后續(xù)版本不需要額外的設(shè)置吩翻,Kotlin插件就可以開箱即用兜看。可以選擇免費(fèi)開源的IntelliJ IDEA Community版仿野,也可以選擇IntelliJ IDEA Ultiamte铣减。在“New Project”(新建項(xiàng)目)對(duì)話框中選擇“Kotlin”,然后就可以開始工作了她君。
??如果你用的是Android Studio,可以從“plug-in manager”(插件管理器)中安裝Kotlin插件脚作。打開“Settings”(設(shè)置)對(duì)話框,選擇“Plugins”(插件)缔刹,單擊“Install JetBrains Plugin”(安裝JetBrains插件)按鈕球涛,然后從列表中選擇“Kotlin”。

1.5.3 交互式shell

如果你想快速地嘗試小段的Kotlin代碼校镐,可以使用交互式shell(也叫REPL3
)亿扁。在REPL中,可以逐行地輸入Kotlin代碼并立即看到其執(zhí)行結(jié)果鸟廓,可以使用不帶任何參數(shù)的kotlinc命令啟動(dòng)REPL,也可以從IntelliJ IDEA的“Kotlin”菜單中選擇啟動(dòng)REPL从祝。

1.5.4 Eclipse插件

如果你是Eclipse用戶,同樣可以選擇在你的IDE中使用Kotlin引谜。Kotlin的Eclipse插件提供了必要的IDE功能牍陌,如導(dǎo)航和代碼補(bǔ)全。該插件可以在Eclispe Marketplace 中找到员咽。要安裝它毒涧,請(qǐng)選擇“Help>Eclipse Markerplace”菜單項(xiàng),然后在列表中搜索“Kotlin”贝室。

1.5.5 在線playground

嘗試Kotlin的最簡(jiǎn)單的方式契讲,是不需要任何安裝和配置』担可以在http://try.kotl.in找到在線的playground,可以在上面編寫捡偏,編譯及運(yùn)行Kotlin的小程序。Playground上還展示了Kotlin特性的代碼示例峡迷,其中包括了本書所有例子银伟。還有一系列交互式學(xué)習(xí)Kotlin的練習(xí)。

1.5.6 Java 到 Kotlin 的轉(zhuǎn)換器

要熟練掌握一門新語言總是要費(fèi)盡力氣的。幸運(yùn)的是枣申,我們開辟了一條很棒的小捷徑售葡,讓你可以借助現(xiàn)有的Java知識(shí)來加快學(xué)習(xí)和運(yùn)用Kotlin的速度。這個(gè)工具就是Java到Kotlin的自動(dòng)轉(zhuǎn)換器忠藤。
??當(dāng)你開始學(xué)習(xí)Kotlin的時(shí)候挟伙,如果你還沒有記住準(zhǔn)確的語法,轉(zhuǎn)換器能幫你表達(dá)一些內(nèi)容模孩,可以先用Java寫出相應(yīng)的代碼片段尖阔,然后把他粘貼到Kotlin文件中,轉(zhuǎn)換器會(huì)自動(dòng)地將代碼轉(zhuǎn)換成Kotlin榨咐。轉(zhuǎn)換的結(jié)果不一定總是符合語言習(xí)慣介却,但是它一定是可以工作的代碼,這樣就可以讓你的任務(wù)更進(jìn)一步了块茁。
??在現(xiàn)有的Java項(xiàng)目中引入Kotlin時(shí)齿坷,轉(zhuǎn)換器也很好用。當(dāng)你寫一個(gè)新類時(shí)数焊,可以從一開始就用Kotlin永淌。但是如果你要在一個(gè)現(xiàn)有的類上做重大的個(gè)更改時(shí),可能也想在這個(gè)過程中使用Kotlin,這時(shí)轉(zhuǎn)換器就派上用場(chǎng)了佩耳。首先把這個(gè)類轉(zhuǎn)換成Kotlin遂蛀,然后就可以利用現(xiàn)代編程語言的所有優(yōu)勢(shì)來添加更改了。
??在IntelliJ IDEA 中使用轉(zhuǎn)換器再簡(jiǎn)單不過了要么復(fù)制一段Java代碼粘貼到Kotlin文件中干厚,要么觸發(fā)“Convert Java File to Kotlin File”(轉(zhuǎn)換Java文件到Kotlin文件)動(dòng)作來轉(zhuǎn)換整個(gè)文件李滴。也可以在Eclipse中或者線上使用轉(zhuǎn)換器。

1.6 小結(jié)

  1. Kotlin是靜態(tài)類型語言并支持類型推導(dǎo)蛮瞄,運(yùn)行維護(hù)正確性與性能的同時(shí)保持源代碼的整潔所坯。
  2. Kotlin支持面向?qū)ο蠛秃瘮?shù)式兩種編程風(fēng)格,通過頭等函數(shù)使更高級(jí)別的抽象成為可能裕坊,通過支持不可變值簡(jiǎn)化了測(cè)試和多線程開發(fā)包竹。
  3. 在服務(wù)器端應(yīng)用程序中它工作得很好,全面支持所有現(xiàn)存的Java框架籍凝,為常見的任務(wù)提供了新工具周瞎,如生成HTML和持久化。
  4. 在Android上它可以工作饵蒂,這得益于緊湊的運(yùn)行時(shí)声诸,對(duì)Android API特殊的編譯器支持以及豐富的庫,為常見Android開發(fā)任務(wù)提供了Kotlin友好的函數(shù)退盯。
  5. 它是免費(fèi)和開源的彼乌,全面支持主流的IDE和構(gòu)建系統(tǒng)泻肯。
  6. Kotlin是務(wù)實(shí)的,安全的慰照,簡(jiǎn)潔的灶挟,與Java可互操作性,意味著它專注于使用已經(jīng)證明果的解決方案處理常見的任務(wù)毒租,防止常見的像NullPointException這樣的錯(cuò)誤稚铣,支持緊湊和易讀的代碼,以及提供與Java無限制的集成墅垮。

企業(yè)級(jí)獨(dú)立部署應(yīng)用:知行辦公http://zx.naton.cn
【總監(jiān)】十二春秋之惕医,3483099@qq.com
【Master】zelo算色,616701261@qq.com抬伺;
【運(yùn)營】運(yùn)維艄公,897221533@qq.com灾梦;
【產(chǎn)品設(shè)計(jì)】流浪貓峡钓,364994559@qq.com
【體驗(yàn)設(shè)計(jì)】兜兜斥废,2435632247@qq.com椒楣;
【iOS】淘碼小工,492395860@qq.com牡肉;iMcG33K,imcg33k@gmail.com淆九;
【Android】人猿居士统锤,1059604515@qq.com;思路的頓悟炭庙,1217022114@qq.com饲窿;
【java】首席工程師MR_W,feixue300@qq.com焕蹄;
【測(cè)試】土鏡問道逾雄,847071279@qq.com
【數(shù)據(jù)】fox009521腻脏,42151960@qq.com鸦泳;
【安全】保密,你懂的永品。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末做鹰,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子鼎姐,更是在濱河造成了極大的恐慌钾麸,老刑警劉巖更振,帶你破解...
    沈念sama閱讀 206,839評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異饭尝,居然都是意外死亡肯腕,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門钥平,熙熙樓的掌柜王于貴愁眉苦臉地迎上來乎芳,“玉大人,你說我怎么就攤上這事帖池∧位螅” “怎么了?”我有些...
    開封第一講書人閱讀 153,116評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵睡汹,是天一觀的道長肴甸。 經(jīng)常有香客問我,道長囚巴,這世上最難降的妖魔是什么原在? 我笑而不...
    開封第一講書人閱讀 55,371評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮彤叉,結(jié)果婚禮上庶柿,老公的妹妹穿的比我還像新娘。我一直安慰自己秽浇,他們只是感情好浮庐,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,384評(píng)論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著柬焕,像睡著了一般审残。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上斑举,一...
    開封第一講書人閱讀 49,111評(píng)論 1 285
  • 那天搅轿,我揣著相機(jī)與錄音,去河邊找鬼富玷。 笑死璧坟,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的赎懦。 我是一名探鬼主播雀鹃,決...
    沈念sama閱讀 38,416評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼铲敛!你這毒婦竟也來了褐澎?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,053評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤伐蒋,失蹤者是張志新(化名)和其女友劉穎工三,沒想到半個(gè)月后迁酸,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,558評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡俭正,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,007評(píng)論 2 325
  • 正文 我和宋清朗相戀三年奸鬓,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片掸读。...
    茶點(diǎn)故事閱讀 38,117評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡串远,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出儿惫,到底是詐尸還是另有隱情澡罚,我是刑警寧澤,帶...
    沈念sama閱讀 33,756評(píng)論 4 324
  • 正文 年R本政府宣布肾请,位于F島的核電站留搔,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏铛铁。R本人自食惡果不足惜隔显,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,324評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望饵逐。 院中可真熱鬧括眠,春花似錦、人聲如沸倍权。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽账锹。三九已至萌业,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間奸柬,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評(píng)論 1 262
  • 我被黑心中介騙來泰國打工婴程, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留廓奕,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,578評(píng)論 2 355
  • 正文 我出身青樓档叔,卻偏偏與公主長得像桌粉,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子衙四,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,877評(píng)論 2 345

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