Numbers
Kotlin 處理數字在某種程度上接近 Java,但是并不完全相同。例如,對于數字沒有隐式拓寬轉換(如 Java 中 int 可以隐式轉換為long——譯者注),另外有些情況的字面值略有不同。
Kotlin 提供了如下的内置類型來表示數字(與 Java 很相近):
Type | Bit width |
---|---|
Long | 64 |
Double | 64 |
Float | 32 |
Int | 32 |
Short | 16 |
Byte | 8 |
注意在 Kotlin 中字元不是數字
比較兩個數字
Kotlin 中沒有基礎資料類型,隻有封裝的數字類型,你每定義的一個變量,其實 Kotlin 幫你封裝了一個對象,這樣可以保證不會出現空指針。數字類型也一樣,所有在比較兩個數字的時候,就有比較資料大小和比較兩個對象是否相同的差別了。
=:指派,在邏輯運算時也有效;
==:等于運算,比較的是值,而不是引用;
===:完全等于運算,不僅比較值,而且還比較引用,隻有兩者一緻才為真。
fun main(args: Array<String>) {
val a: Int = 10000
println(a === a) // true,值相等,對象位址相等
//經過了裝箱,建立了兩個不同的對象
val boxedA: Int? = a
val anotherBoxedA: Int? = a
//雖然經過了裝箱,但是值是相等的,都是10000
println(boxedA === anotherBoxedA) // false,值相等,對象位址不一樣
println(boxedA == anotherBoxedA) // true,值相等
}
類型轉換
由于不同的表示方式,較小類型并不是較大類型的子類型,較小的類型不能隐式轉換為較大的類型。 這意味着在不進行顯式轉換的情況下我們不能把 Byte 型值賦給一個 Int 變量。
val b: Byte = 1 // OK, 字面值是靜态檢測的
val i: Int = b // 錯誤
我們可以代用其toInt()方法。
val b: Byte = 1 // OK, 字面值是靜态檢測的
val i: Int = b.toInt() // OK
每種資料類型都有下面的這些方法,可以轉化為其它的類型:
toByte(): Byte
toShort(): Short
toInt(): Int
toLong(): Long
toFloat(): Float
toDouble(): Double
toChar(): Char
有些情況下也是可以使用自動類型轉化的,前提是可以根據上下文環境推斷出正确的資料類型而且數學操作符會做相應的重載。例如下面是正确的:
val l = 1L + 3 // Long + Int => Long
運算符
Kotlin支援标準的算數操作符,并在相應的類上定義為成員函數(但編譯器會針對運算進行優化,将函數調用優化成直接的算數操作)。
對于按位操作(bitwise operation),沒有特别的符号來表示,而是直接使用命名函數.
val x = (1 shl 2) and 0x000FF000
//已經支援位運算操作 (隻能對 Int 或者 Long 使用)
shl(bits) – signed shift left (Java’s <<)
shr(bits) – signed shift right (Java’s >>)
ushr(bits) – unsigned shift right (Java’s >>>)
and(bits) – bitwise and 位與
or(bits) – bitwise or 位或
xor(bits) – bitwise xor 位異或
inv() – bitwise inversion 位反轉
字元
和 Java 不一樣,Kotlin 中的 Char 不能直接和數字操作,Char 必需是單引号”包含起來的。比如普通字元 ‘0’,’a’。
fun check(c: Char) {
if (c == 1) { // 錯誤:類型不相容
// ……
}
}
字元字面值用單引号括起來: ‘1’。 特殊字元可以用反斜杠轉義。 支援這幾個轉義序列:\t、 \b、\n、\r、\’、\”、\ 和 $。 編碼其他字元要用 Unicode 轉義序列文法:’\uFF00’。
我們可以顯式把字元轉換為 Int 數字:
fun decimalDigitValue(c: Char): Int {
if (c !in '0'..'9')
throw IllegalArgumentException("Out of range")
return c.toInt() - '0'.toInt() // 顯式轉換為數字
}
布爾
布爾用 Boolean 類型表示,它有兩個值:true 和 false。
若需要可空引用布爾會被裝箱。
内置的布爾運算有:
- || – 短路邏輯或
- && – 短路邏輯與
- ! - 邏輯非
數組
數組在 Kotlin 中使用 Array 類來表示,它定義了 get 和 set 函數(按照運算符重載約定這會轉變為 [])和 size 屬性,以及一些其他有用的成員函數,是以我們可以通過下标很友善的擷取或者設定數組對應位置的值。
數組的建立兩種方式:一種是使用函數arrayOf();另一個選項是用接受數組大小和一個函數參數的工廠函數,用作參數的函數能夠傳回給定索引的每個元素初始值;還有一種是使用arrayOfNulls建立一個資料為空的數組。如下所示,我們分别是三種方式建立了三個數組:
//Array<String>可以省略,arrayOf會自動判斷資料的類型
var a1: Array<String> = arrayOf("data1", "data2")
// 建立一個 Array<String> 初始化為 ["0", "1", "4", "9", "16"]
val asc = Array(5, { i -> (i * i).toString() })
//建立一個指定大小、元素都為空的數組,但必須指定類型
var a3 = arrayOfNulls<String>(10)
//讀取數組内容
println(a1[0])
println(a2[1])
除了類Array,還有ByteArray, ShortArray, IntArray,用來表示各個類型的數組,省去了裝箱操作,是以效率更高,其用法同Array一樣:
val x: IntArray = intArrayOf(1, 2, 3)
x[0] = x[1] + x[2]
字元串
和 Java 一樣,String 是可不變的。方括号 [] 文法可以很友善的擷取字元串中的某個字元,也可以通過 for 循環來周遊:
for (c in str) {
println(c)
}
Kotlin 支援三個引号 “”” 擴起來的字元串,支援多行字元串,比如:
val text = """
多行字元串
多行字元串
"""
println(text) // 輸出有一些前置空格
輸出:
---------------------
多行字元串
多行字元串
---------------------
String 可以通過 trimMargin() 方法來删除多餘的空白。
val text = """
|多行字元串
|多行字元串
|多行字元串
|多行字元串
""".trimMargin()
println(text) // 前置空格删除了
輸出:
---------------------
多行字元串
多行字元串
多行字元串
多行字元串
---------------------
預設 | 用作邊界字首,但你可以選擇其他字元并作為參數傳入,比如 trimMargin(“>”)。
字元串模闆
字元串可以包含模闆表達式 ,即一些小段代碼,會求值并把結果合并到字元串中。 模闆表達式以美元符($)開頭,由一個簡單的名字構成:
val i = 10
val s = "i = $i" // 求值結果為 "i = 10"
或者用花括号擴起來的任意表達式:
val s = "abc"
val str = "$s.length is ${s.length}" // 求值結果為 "abc.length is 3"
原生字元串和轉義字元串内部都支援模闆。 如果你需要在原生字元串中表示字面值 $ 字元(它不支援反斜杠轉義),你可以用下列文法:
val price = """
${'$'}9.99
"""
println(price) // 求值結果為 $9.99