Kotlin 知識總結(jié)梳理 - Kotlin 基礎(chǔ)


一班利、本文概要

本文是對<<Kotlin in Action>>的學(xué)習(xí)筆記壶辜,如果需要運(yùn)行相應(yīng)的代碼可以訪問在線環(huán)境try.kotlinlang.org,這部分的思維導(dǎo)圖為:

kotlin 基礎(chǔ)

二许饿、函數(shù)和變量

2.1 函數(shù)

2.1.1 函數(shù)的基本構(gòu)成

在Kotlin中曹锨,函數(shù)的基本結(jié)構(gòu)由四個部分構(gòu)成:

函數(shù)名稱

參數(shù)列表

返回類型

函數(shù)體

函數(shù)的聲明以關(guān)鍵字fun開始,函數(shù)名稱緊隨其后论矾,接下來是括號括起來的參數(shù)列表教翩,參數(shù)列表的后面跟著返回類型,返回類型和參數(shù)列表之間用冒號隔開贪壳,最后是函數(shù)體饱亿。

下面是一個比較大小的函數(shù)例子,上面談到的四個部分構(gòu)成如圖中標(biāo)注所示:

2.1.2 表達(dá)式和語句

在上面的例子中闰靴,if是表達(dá)式彪笼,而不是語句,表達(dá)式和語句的區(qū)別在于:

表達(dá)式有值蚂且,并且能作為另一個表達(dá)式的一部分使用配猫。

語句總是包含著它的代碼塊中的頂層元素,并且沒有自己的值杏死。

在Java中泵肄,所有的控制結(jié)構(gòu)都是語句,而在Kotlin中淑翼,除了for腐巢、do和do/while以外大多數(shù)控制結(jié)構(gòu)都是表達(dá)式。

當(dāng)函數(shù)體是由單個表達(dá)式構(gòu)成時玄括,可以用這個表達(dá)式作為完整的函數(shù)體冯丙,并且去掉花括號和return語句,上面的例子就是這種情況遭京,因此可以改寫為:

如果函數(shù)體寫在花括號中胃惜,我們說這個函數(shù)有代碼塊體

如果它直接返回了一個表達(dá)式,它就有表達(dá)式體

2.1.3 省略返回類型

對于表達(dá)式體函數(shù)哪雕,可以省略返回類型船殉,因?yàn)榫幾g器會分析作為函數(shù)體的表達(dá)式,并把它的類型作為函數(shù)的返回類型热监,這種分析稱為類型推導(dǎo)捺弦。但是對于有返回值的代碼塊體函數(shù)饮寞,必須顯示地寫出返回類型和return語句孝扛。

上面的例子可以簡化為:

2.2 變量

在Kotlin中列吼,變量的聲明以關(guān)鍵字val/var開始,然后是變量名稱苦始,最后可以加上類型(不加也可以)寞钥,這里分為兩種情況:

如果指定了初始化器,那么在不指定類型的情況下陌选,編譯器會分析初始化器表達(dá)式的值理郑,并把它的類型作為變量的類型,例如下面兩個就分別為Int和Double類型:

如果沒有指定初始化器咨油,需要顯示地指定它的類型您炉,因?yàn)榇藭r編譯器無法推斷出它的類型。

2.2.1 可變變量和不可變變量

聲明變量的關(guān)鍵字有兩個:

(1) 不可變引用 val

使用val聲明的變量不能在初始化之后再次賦值役电,它對應(yīng)的是Java的final變量赚爵。

默認(rèn)情況下,應(yīng)該盡可能地使用val關(guān)鍵字來聲明所有的Kotlin變量法瑟。在定義了val變量的代碼塊執(zhí)行期間冀膝,val變量只能進(jìn)行唯一一次初始化,但是霎挟,如果編譯器能確保唯一一條初始化語句會被執(zhí)行窝剖,可以根據(jù)條件使用不同的值來初始化它。

(2) 可變引用 var

這種變量的值可以改變酥夭,但是它的類型卻是改變不了的赐纱。

如果需要在變量中存儲不匹配類型的值,必須手動把值轉(zhuǎn)換或強(qiáng)制轉(zhuǎn)換到正確的類型采郎。

2.2.2 字符串模板

Kotlin可以在字符串字面值中引用局部變量千所,只需要在變量名稱前面加上字符$。

如果要在字符串中使用$蒜埋,需要對它進(jìn)行轉(zhuǎn)義淫痰。

運(yùn)行結(jié)果為:

除了可以引用局部變量之外,還可以引用更加復(fù)雜的表達(dá)式整份,只需要把表達(dá)式用花括號擴(kuò)起來待错。

2.3 類

2.3.1 屬性

類的概念就是把數(shù)據(jù)和處理數(shù)據(jù)的代碼封裝成一個單一的實(shí)體,在Java中烈评,數(shù)據(jù)存儲在字段中火俄,并且通常是私有的。如果想讓類的使用者訪問到數(shù)據(jù)得提供訪問方法讲冠,即getter/setter瓜客。

在Java中,字段和其訪問器的組合常常被叫作屬性。在Kotlin中谱仪,屬性是頭等的語言特性玻熙,完全替代了字段和訪問器方法。在類中聲明一個屬性和聲明一個變量一樣:使用val/var關(guān)鍵字疯攒,前者是只讀的嗦随,而后者是可變的。

當(dāng)聲明屬性的時候敬尺,就聲明了對應(yīng)的訪問器(只讀屬性有一個gettter枚尼,而可變屬性則有g(shù)etter/setter),例如下面的例子砂吞,聲明了只讀的name屬性署恍,可變的isMarried屬性,其賦值和讀取的方法如下所示:

運(yùn)行結(jié)果為:

2.3.2 自定義訪問器

假設(shè)聲明一個矩形蜻直,它能判斷自己是否是正方形锭汛,那么就不需要一個單獨(dú)的字段來存儲這個信息,此時我們可以寫一個自定義的訪問器:用val開頭作為聲明袭蝗,緊跟著的是屬性的名稱和類型唤殴,接下來是get()關(guān)鍵字,最后是一個函數(shù)體到腥。

運(yùn)行結(jié)果為:

2.3.3 目錄和包

Kotlin中包的概念和Java類似朵逝,每個kotlin文件都能以一個package語句開頭,而文件中定義的所有聲明(類乡范、函數(shù)及屬性)都會被放到這個包中配名。

如果其他文件定義的聲明也有相同的包,這個文件可以直接使用它們晋辆;如果包不同渠脉,則需要導(dǎo)入它們,導(dǎo)入語句放在文件的最前面并使用import關(guān)鍵字瓶佳。

kotlin不區(qū)分導(dǎo)入的是類還是函數(shù)芋膘,而且,它允許使用import關(guān)鍵字導(dǎo)入任何種類的聲明霸饲,可以直接導(dǎo)入頂層函數(shù)的名稱为朋,也可以在包名稱后加上.*來導(dǎo)入特定包中定義的所有聲明。

在Java中厚脉,要把類放到和包結(jié)構(gòu)相匹配的文件與目錄結(jié)構(gòu)中习寸,而在kotlin中,可以把多個package聲明不相同的類放在同一個文件夾中傻工。

2.4 表示和處理選擇:枚舉和 when

2.4.1 聲明枚舉類

簡單枚舉類

聲明枚舉類時霞溪,enum是一個所謂的軟關(guān)鍵字孵滞,只有當(dāng)它出現(xiàn)在class前面時才有特殊的意義,在其他地方可以當(dāng)做普通名稱使用鸯匹。而class仍然是一個關(guān)鍵字剃斧,下面是一個枚舉類的聲明:

帶屬性的枚舉類

以下是一個帶屬性的枚舉類:

運(yùn)行結(jié)果為:

當(dāng)聲明一個帶屬性的枚舉類時,有幾點(diǎn)需要注意:

當(dāng)聲明每個枚舉常量的時候忽你,必須提供該常量的屬性值。

如果要在枚舉類中定義任何方法臂容,就要使用分號把枚舉常量列表和方法分開科雳。

2.4.2 使用 "when” 處理枚舉類

when是一個有返回值的表達(dá)式,因此脓杉,作為表達(dá)式函數(shù)體糟秘,它可以去掉花括號和return語句,并省略返回類型的聲明球散。

下面是一個通過when處理枚舉類的例子尿赚,它和Java中的switch語句類似,根據(jù)when中Color的值走到對應(yīng)的分支蕉堰,除此之外凌净,我們可以把多個值用逗號間隔,合并到同一個分支:

運(yùn)行的結(jié)果為:

2.4.3 在 “when”結(jié)構(gòu)中使用任意對象

在Java中屋讶,和when類似的switch語句要求必須使用常量(枚舉常量冰寻、字符串或者數(shù)字字面值)作為分支條件,而when允許使用任何對象皿渗,我們使用一個函數(shù)來混合兩種顏色斩芭。下面例子中用到的setOf是由Kotlin標(biāo)準(zhǔn)函數(shù)庫提供的,它可以創(chuàng)建出一個Set乐疆,并且會包含所有指定為函數(shù)實(shí)參的對象划乖,只要兩個set中包含一樣的條目,它們就是相等的挤土,集合的條目順序并不重要琴庵。

運(yùn)行結(jié)果為:

除此之外,我們還可以不給when表達(dá)式提供參數(shù)仰美,這樣分支條件就是任意的布爾表達(dá)時细卧,這種寫法的優(yōu)點(diǎn)是不會創(chuàng)建額外的對象,但代價是它更難理解筒占。

2.4.4 智能轉(zhuǎn)換:合并類型檢查和轉(zhuǎn)換

在kotlin中贪庙,判斷一個變量是否是某種類型需要使用is關(guān)鍵字,它和Java當(dāng)中的instanceOf相似翰苫。

在Java中止邮,在檢查完后還需要顯示地加上類型轉(zhuǎn)換这橙。

在kotlin中,如果你檢查過一個變量是某種類型导披,后面就不需要再轉(zhuǎn)換它屈扎,可以把它當(dāng)做你檢查過的類型來使用。

我們用下面這個例子撩匕,Num和Sum都實(shí)現(xiàn)了Expr接口鹰晨,通過is判斷它的類型,完成遞歸求和止毕∧@可以看到,在is判斷之后扁凛,不再需要轉(zhuǎn)換成Num或Sum忍疾,就可以直接訪問該類的成員變量。

運(yùn)行結(jié)果為:

智能轉(zhuǎn)換只在變量經(jīng)過is檢查且之后不再發(fā)生變化的情況下有效谨朝,當(dāng)你對一個類的屬性進(jìn)行智能轉(zhuǎn)換的時候卤妒,這個屬性必須是一個val屬性,而且不能有自定義的訪問器字币,否則则披,每次對屬性的訪問是否都能返回同樣的值將無從驗(yàn)證。

2.4.5 代碼塊作為 "if" 和 "when" 的分支

if和when都可以使用代碼塊作為分支體洗出,這種情況下收叶,代碼塊中的最后一個表達(dá)式就是結(jié)果,這個規(guī)則在所有使用代碼塊并期望得到一個結(jié)果的地方成立共苛。同樣的規(guī)則對try主體和catch子句也有效判没。

運(yùn)行結(jié)果為:

2.5 迭代事物

2.5.1 while 循環(huán)

kotlin和Java一樣,有while循環(huán)和do-while循環(huán)隅茎,它們的語法和Java中相應(yīng)的循環(huán)完全一致澄峰。

2.5.2 迭代數(shù)字:區(qū)間和數(shù)列

在Java當(dāng)中,對于循環(huán)的處理方式為:先初始化變量辟犀,在循環(huán)的每一步更新它的值俏竞,并在值滿足某個限制條件時退出循環(huán)。

而在Kotlin中堂竟,為了替代常見的循環(huán)用法魂毁,使用了區(qū)間的概念,其本質(zhì)上就是兩個值之間的間隔出嘹,這兩個值通常是數(shù)字:一個起始值席楚,一個結(jié)束值。使用..運(yùn)算符來表示區(qū)間税稼,而結(jié)束值始終是區(qū)間的一部分烦秩。

運(yùn)行結(jié)果為:

除此之外垮斯,還有downTo、step和until等用于區(qū)間的語法只祠,用于進(jìn)行循環(huán)操作兜蠕,例如下面的例子downTo用于遞減到指定的值,而step則指定步長:

運(yùn)行結(jié)果為:

使用until則可以使迭代不包含指定的結(jié)束值抛寝,例如下面這樣:

運(yùn)行結(jié)果為:

2.5.3 迭代 map

更新 map

這里我們用到了TreeMap熊杨,在更新map時,我們可以像使用數(shù)組一樣盗舰,只不過下標(biāo)變成了key值:

訪問 map

下面的例子展示了for允許允許展開迭代中的集合的元素晶府,把展開的結(jié)果存儲到了兩個獨(dú)立的變量中:letter是鍵、binary是值:

運(yùn)行結(jié)果為:

2.5.4 使用 "in" 檢查集合和區(qū)間的成員

使用in運(yùn)算符來檢查一個值是否在區(qū)間中岭皂,或者它的逆運(yùn)算!in來檢查這個值是否不在區(qū)間中,區(qū)間不僅限于字符沼头,假如有一個支持實(shí)例比較操作的任意類(實(shí)現(xiàn)了java.lang.Comparable接口)爷绘,就能創(chuàng)建這種類型的對象的區(qū)間。

運(yùn)行結(jié)果為:

2.5 kotlin 中的異常

kotlin的異常處理和Java以及其他許多語言的處理方式類似:一個函數(shù)可以正常結(jié)束进倍,也可以在出現(xiàn)錯誤的情況下拋出異常土至。方法的調(diào)用者能捕獲到這個異常并處理它;如果沒有處理猾昆,異常會沿著調(diào)用棧再次拋出陶因。

拋出異常時使用throw關(guān)鍵字,但是不必使用new關(guān)鍵字來創(chuàng)建異常實(shí)例垂蜗。

throw結(jié)構(gòu)是一個表達(dá)式楷扬,能作為另一個表達(dá)式的一部分使用。

2.5.1 “try” "catch" 和 "finally"

當(dāng)使用帶有catch和finally子句的try結(jié)構(gòu)來處理異常時贴见,下面是一個典型的結(jié)構(gòu):

和Java最大區(qū)別就是throws子句沒有出現(xiàn)在代碼中:如果使用Java來寫這個函數(shù)烘苹,你會顯示地在函數(shù)聲明上面寫上throws IOException。這是因?yàn)镮OException是一個受檢異常片部,在Java中镣衡,這種異常必須顯示地處理,必須聲明你的函數(shù)能拋出所有的受檢異常档悠。

Java 處理方式

kotlin不區(qū)分受檢異常和未受檢異常廊鸥,不必指定函數(shù)拋出的異常,而且可以處理也可以不處理異常辖所。

與此同時惰说,BufferReader.close可能拋出需要處理的受檢異常,如果關(guān)閉失敗缘回,大多數(shù)程序不會采取什么有意義的行動助被,所以捕獲來自close方法的異常所需的代碼是多余的剖张。

2.5.2 “try”作為表達(dá)式

kotlin中的try關(guān)鍵字就像if和when一樣,引入了一個表達(dá)式揩环,可以把它的值賦給一個變量搔弄,并且需要用花括號把語句主體括起來。如果主體包含多個表達(dá)式丰滑,那么整個try表達(dá)式的值就是最后一個表達(dá)式的值顾犹。

運(yùn)行結(jié)果為:

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市褒墨,隨后出現(xiàn)的幾起案子炫刷,更是在濱河造成了極大的恐慌,老刑警劉巖郁妈,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件浑玛,死亡現(xiàn)場離奇詭異,居然都是意外死亡噩咪,警方通過查閱死者的電腦和手機(jī)顾彰,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來胃碾,“玉大人涨享,你說我怎么就攤上這事∑桶伲” “怎么了厕隧?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長俄周。 經(jīng)常有香客問我吁讨,道長,這世上最難降的妖魔是什么峦朗? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任媚朦,我火速辦了婚禮越庇,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己侄泽,他們只是感情好载佳,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布孝凌。 她就那樣靜靜地躺著误债,像睡著了一般。 火紅的嫁衣襯著肌膚如雪迄埃。 梳的紋絲不亂的頭發(fā)上疗韵,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天,我揣著相機(jī)與錄音侄非,去河邊找鬼蕉汪。 笑死流译,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的者疤。 我是一名探鬼主播福澡,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼驹马!你這毒婦竟也來了革砸?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤糯累,失蹤者是張志新(化名)和其女友劉穎算利,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體泳姐,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡效拭,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了胖秒。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片缎患。...
    茶點(diǎn)故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖扒怖,靈堂內(nèi)的尸體忽然破棺而出较锡,到底是詐尸還是另有隱情业稼,我是刑警寧澤盗痒,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站低散,受9級特大地震影響俯邓,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜熔号,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一稽鞭、第九天 我趴在偏房一處隱蔽的房頂上張望惯疙。 院中可真熱鬧熊赖,春花似錦、人聲如沸刊愚。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至赴恨,卻和暖如春疹娶,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背伦连。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工雨饺, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留钳垮,地道東北人。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓额港,卻偏偏與公主長得像饺窿,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子锹安,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評論 2 344

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