天天看點

Kotlin文法(其他)三、其他

[TOC]

有時候可以通過給對象插入多個成員函數做差別是很友善的:

多重聲明一次建立了多個變量。我們聲明了倆個新變量:name age 并且可以獨立使用:

也可以在 for 循環中用:

map:

函數操作符是<code>:</code>

is !is 表達式: 類似Java的instanceof

“不安全”的轉換符,如下的x不能為空,否則抛異常:

"安全"轉換符,如下不管 as? 右邊的是不是一個非空 String 結果都會轉換為可空的:

如果 this 沒有應用者,則指向的是最内層的閉合範圍。為了在其它範圍中傳回 this ,需要使用标簽:<code>this@lable</code>

在 kotlin 中有兩種相等:

參照相等: <code>===</code>,參照相等是通過 === 操作符判斷的(不等是!== ) a===b 隻有 a b 指向同一個對象是判别才成立。另外,你可以使用内聯函數<code>identityEquals()</code> 判斷參照相等。

結構相等: <code>==</code>,結構相等是通過 == 判斷的。像<code>a == b</code>将會翻譯成:<code>a?.equals(b) ?: b === null</code>,如果 a 不是 null 則調用 equals(Any?) 函數,否則檢查 b 是否參照等于 null。

<a href="http://kotlinlang.org/docs/reference/operator-overloading.html">http://kotlinlang.org/docs/reference/operator-overloading.html</a>

安全調用在鍊式調用是是很有用的。比如,如果 Bob 是一個雇員可能配置設定部門(也可能不配置設定),如果我們想擷取 Bob 的部門名作為名字的字首,就可以這樣做:

Elvis 操作符:

也可以使用 Elvis 操作符<code>?:</code>:

如果 ?: 左邊表達式不為空則傳回,否則傳回右邊的表達式。注意右邊的表帶式隻有在左邊表達式為空是才會執行。

!!操作符:

第三個選擇是 NPE-lovers。我們可以用 b!! ,這會傳回一個非空的 b 或者抛出一個 b 為空的 NPE:

安全轉換:

普通的轉換可能産生 ClassCastException 異常。另一個選擇就是使用安全轉換,如果不成功就傳回空:

所有的異常類都是 Exception 的子類。使用方式與Java類似。

注解是一種将中繼資料附加到代碼中的方法。聲明注解需要在類前面使用 annotation 關鍵字:

用法:在多數情形中 @ 辨別是可選的。隻有在注解表達式或本地聲明中才必須

如果要給構造函數注解,就需要在構造函數聲明時添加 constructor 關鍵字,并且需要在前面添加注解:

注解可以有帶參數的構造函數:

注解也可以用在 Lambda 中。這将會應用到 lambda 生成的 invoke() 方法:

java 注解在 kotlin 中是完全相容的。

如果java 中的 value 參數有數組類型,則在 kotlin 中變成 vararg 參數:

注解執行個體的值在 kotlin 代碼中是暴露屬性。

得到運作時的類引用:

引用是一種 KClass類型的值。你可以使用<code>KClass.properties</code> 和<code>KClass.extensionProperties</code>擷取類和父類的所有屬性引用的清單。

函數引用

使用<code>::</code>操作符:

這裡<code>::isOdd</code>是是一個函數類型的值<code>(Int) -&gt; Boolean</code>

下面是傳回一個由兩個傳遞進去的函數的組合。現在你可以把它用在可調用的引用上了:

屬性引用

通路頂級類的屬性,我們也可以使用<code>::</code>操作符:

<code>::x</code>表達式評估為<code>KProperty&lt;Int&gt;</code>類型的屬性,它允許我們使用<code>get()</code>讀它的值或者使用名字取回它的屬性。

對于擴充屬性:

與 java 反射調用

想找到一個備用字段或者 java getter 方法:

構造函數引用

隻需要使用<code>::</code>操作符并加上類名。下面的函數是一個沒有參數并且傳回類型是<code>Foo</code>:

為了友善使用,<code>dynamic</code>應而生:

<code>dynamic</code>類型關閉了 kotlin 的類型檢查:

這樣的類型可以配置設定任意變量或者在任意的地方作為參數傳遞 任何值都可以配置設定為dynamic 類型,或者作為參數傳遞給任何接受 dynamic 類型參數的函數 這樣的類型不做 null 檢查

<code>dynamic</code>最奇特的特性就是可以在<code>dynamic</code>變量上調用任何屬性或任何方法。

動态調用可以傳回<code>dynamic</code>作為結果,是以我們可以輕松實作鍊式調用:

當給動态調用傳遞一個 lambda 表達式時,所有的參數預設都是<code>dynamic</code>:

參考:

<a href="http://kotlinlang.org/docs/reference/basic-syntax.html">http://kotlinlang.org/docs/reference/basic-syntax.html</a>

<a href="http://huanglizhuo.gitbooks.io/kotlin-in-chinese">http://huanglizhuo.gitbooks.io/kotlin-in-chinese</a>