語(yǔ)法記錄
寫在前面一、題記
本文中的內(nèi)容全部參考的《Kotlin 官方參考文檔 中文版》篙挽,本文只是做學(xué)習(xí)筆記,以供自己及他人學(xué)習(xí)方便镊靴,并不是原創(chuàng)铣卡,感謝原創(chuàng)!
寫在前面二偏竟、main方法在AndroidStudio中直接運(yùn)行的說(shuō)明
-
1煮落、創(chuàng)建Kotlin文件
創(chuàng)建Kotlin文件.png -
2、創(chuàng)建完成后基本上只有包的路徑地址踊谋,其它什么都沒(méi)有
創(chuàng)建后的Kotlin文件.png - 3蝉仇、創(chuàng)建main方法
創(chuàng)建main方法.png
-
4、右鍵執(zhí)行
運(yùn)行main方法.png - 查看輸出結(jié)果
查看輸出結(jié)果.png
一殖蚕、方法定義
fun 方法名(形參名稱: 形參類型, 形參名稱: 形參類型, ...): 返回類型{
方法體
}
注:返回類型如果無(wú):可以忽略或使用Unit類型
二轿衔、局部變量定義
- 一次賦值(只讀)的局部變量(使用val關(guān)鍵字):
fun method() {
val a: Int = 1 // 立即賦值
val b = 2 // 自動(dòng)推斷出 `Int` 類型
val c: Int // 如果沒(méi)有初始值類型不能省略
c = 3 // 明確賦值
println("a = $a, b = $b, c = $c")//引用值時(shí)使用$符號(hào)
}
- 可變變量(使用var關(guān)鍵字):
fun method() {
var x = 5 // 自動(dòng)推斷出 `Int` 類型
x += 1
var d: Int = 33//指定類型為Int類型
d += 2
println("x = $x")
}
三、注釋
// 這是一個(gè)行注釋
/* 這是一個(gè)多行的
塊注釋睦疫。 */
與 Java 不同的是害驹,Kotlin 的塊注釋可以嵌套。
參見(jiàn)編寫 Kotlin 代碼文檔 查看關(guān)于文檔注釋語(yǔ)法的信息
四蛤育、字符串模板
- 字符串可以包含模板表達(dá)式 宛官,即一些小段代碼,會(huì)求值并把結(jié)果合并到字符串中瓦糕。 模板表達(dá)式以美元符($)開頭底洗,由一個(gè)簡(jiǎn)單的名字構(gòu)成:
val i = 10 val s = "i = $i" // 求值結(jié)果為 "i = 10"
- 或者用花括號(hào)括起來(lái)的任意表達(dá)式:
val s = "abc" val str = "$s.length is ${s.length}" // 求值結(jié)果為 "abc.length is 3"
- 原生字符串和轉(zhuǎn)義字符串內(nèi)部都支持模板。 如果你需要在原生字符串中表示字面值 $ 字符(它不支持反斜杠轉(zhuǎn)義)咕娄,你可以用下列語(yǔ)法:
val price = """ ${'$'}9.99 """
- 例:
輸出結(jié)果:a was 1, but now is 2fun method() { var a = 1 // 模板中的簡(jiǎn)單名稱: val s1 = "a is $a" a = 2 // 模板中的任意表達(dá)式: val s2 = "${s1.replace("is", "was")}, but now is $a" println(s2) }
五亥揖、使用條件表達(dá)式
- 例:
//sampleStart fun maxOf(a: Int, b: Int): Int { if (a > b) { return a } else { return b } } //sampleEnd fun main(args: Array<String>) { println("max of 0 and 42 is ${maxOf(0, 42)}") }
- 使用
if
作為表達(dá)式://sampleStart fun maxOf(a: Int, b: Int) = if (a > b) a else b //sampleEnd fun main(args: Array<String>) { println("max of 0 and 42 is ${maxOf(0, 42)}") }
參見(jiàn) if、when谭胚、for徐块、while 表達(dá)式未玻。
六、使用可空值及 null 檢測(cè)
當(dāng)某個(gè)變量的值可以為
null
的時(shí)候胡控,必須在聲明處的類型后添加?
來(lái)標(biāo)識(shí)該引用可為空扳剿。-
如果
str
的內(nèi)容不是數(shù)字返回null
:fun parseInt(str: String): Int? { // …… }
-
使用返回可空值的函數(shù):
fun parseInt(str: String): Int? { return str.toIntOrNull() } //sampleStart fun printProduct(arg1: String, arg2: String) { val x = parseInt(arg1) val y = parseInt(arg2) // 直接使用 `x * y` 可能會(huì)報(bào)錯(cuò),因?yàn)樗麄兛赡転?null if (x != null && y != null) { // 在空檢測(cè)后昼激,x 和 y 會(huì)自動(dòng)轉(zhuǎn)換為非空值(non-nullable) println(x * y) } else { println("either '$arg1' or '$arg2' is not a number") } } //sampleEnd fun main(args: Array<String>) { printProduct("6", "7") printProduct("a", "7") printProduct("a", "b") }
或者
fun parseInt(str: String): Int? { return str.toIntOrNull() } fun printProduct(arg1: String, arg2: String) { val x = parseInt(arg1) val y = parseInt(arg2) //sampleStart // …… if (x == null) { println("Wrong number format in arg1: '${arg1}'") return } if (y == null) { println("Wrong number format in arg2: '${arg2}'") return } // 在空檢測(cè)后庇绽,x 和 y 會(huì)自動(dòng)轉(zhuǎn)換為非空值 println(x * y) //sampleEnd } fun main(args: Array<String>) { printProduct("6", "7") printProduct("a", "7") printProduct("99", "b") }
參見(jiàn)空安全。
七橙困、使用類型檢測(cè)及自動(dòng)類型轉(zhuǎn)換
-
is
運(yùn)算符檢測(cè)一個(gè)表達(dá)式是否某類型的一個(gè)實(shí)例瞧掺。 如果一個(gè)不可變的局部變量或?qū)傩砸呀?jīng)判斷出為某類型,那么檢測(cè)后的分支中可以直接當(dāng)作該類型使用凡傅,無(wú)需顯式轉(zhuǎn)換:
甚至//sampleStart fun getStringLength(obj: Any): Int? { if (obj is String) { // `obj` 在該條件分支內(nèi)自動(dòng)轉(zhuǎn)換成 `String` return obj.length } // 在離開類型檢測(cè)分支后辟狈,`obj` 仍然是 `Any` 類型 return null } //sampleEnd fun main(args: Array<String>) { fun printLength(obj: Any) { println("'$obj' string length is ${getStringLength(obj) ?: "... err, not a string"} ") } printLength("Incomprehensibilities") printLength(1000) printLength(listOf(Any())) }
//sampleStart fun getStringLength(obj: Any): Int? { // `obj` 在 `&&` 右邊自動(dòng)轉(zhuǎn)換成 `String` 類型 if (obj is String && obj.length > 0) { return obj.length } return null } //sampleEnd fun main(args: Array<String>) { fun printLength(obj: Any) { println("'$obj' string length is ${getStringLength(obj) ?: "... err, is empty or not a string at all"} ") } printLength("Incomprehensibilities") printLength("") printLength(1000) }
參見(jiàn)類 和 類型轉(zhuǎn)換。
八夏跷、使用 for 循環(huán)
fun main(args: Array<String>) {
//sampleStart
val items = listOf("apple", "banana", "kiwi")
for (item in items) {
println(item)
}
//sampleEnd
}
或者
fun main(args: Array<String>) {
//sampleStart
val items = listOf("apple", "banana", "kiwi")
for (index in items.indices) {
println("item at $index is ${items[index]}")
}
//sampleEnd
}
綜合示例
fun printList(arrs: List<String>){
//遍歷取值
for(arr in arrs){
println(arr)
}
println("---------------------")
//遍歷哼转,使用索引取值
for(index in arrs.indices){
println("item at $index is ${arrs[index]}")
}
println("---------------------")
//遍歷,取索引和值
for((index, value) in arrs.withIndex()){
println("index==$index---value===$value")
}
}
參見(jiàn) for 循環(huán)槽华。
九壹蔓、使用 while 循環(huán)
fun main(args: Array<String>) {
//sampleStart
val items = listOf("apple", "banana", "kiwi")
var index = 0
while (index < items.size) {
println("item at $index is ${items[index]}")
index++
}
//sampleEnd
}
參見(jiàn) while 循環(huán)。
十猫态、使用 when 表達(dá)式
//sampleStart
fun describe(obj: Any): String =
when (obj) {
1 -> "One"
"Hello" -> "Greeting"
is Long -> "Long"
!is String -> "Not a string"
else -> "Unknown"
}
//sampleEnd
fun main(args: Array<String>) {
println(describe(1))
println(describe("Hello"))
println(describe(1000L))
println(describe(2))
println(describe("other"))
}
參見(jiàn) when 表達(dá)式佣蓉。
十一、使用區(qū)間(range)
- 使用
in
運(yùn)算符來(lái)檢測(cè)某個(gè)數(shù)字是否在指定區(qū)間內(nèi):fun main(args: Array<String>) { //sampleStart val x = 10 val y = 9 if (x in 1..y+1) { println("fits in range") } //sampleEnd }
- 檢測(cè)某個(gè)數(shù)字是否在指定區(qū)間外:
fun main(args: Array<String>) { //sampleStart val list = listOf("a", "b", "c") if (-1 !in 0..list.lastIndex) { println("-1 is out of range") } if (list.size !in list.indices) { println("list size is out of valid list indices range too") } //sampleEnd }
- 區(qū)間迭代:
或數(shù)列迭代:fun main(args: Array<String>) { //sampleStart for (x in 1..5) { print(x) } //sampleEnd }
fun main(args: Array<String>) { //sampleStart for (x in 1..10 step 2) { print(x) } for (x in 9 downTo 0 step 3) { print(x) } //sampleEnd }
參見(jiàn)區(qū)間亲雪。
十二勇凭、使用集合
- 對(duì)集合進(jìn)行迭代:
fun main(args: Array<String>) { val items = listOf("apple", "banana", "kiwi") //sampleStart for (item in items) { println(item) } //sampleEnd }
- 使用
in
運(yùn)算符來(lái)判斷集合內(nèi)是否包含某實(shí)例:fun main(args: Array<String>) { val items = setOf("apple", "banana", "kiwi") //sampleStart when { "orange" in items -> println("juicy") "apple" in items -> println("apple is fine too") } //sampleEnd }
- 使用 lambda 表達(dá)式來(lái)過(guò)濾(filter)和映射(map)集合:
fun main(args: Array<String>) { val fruits = listOf("banana", "avocado", "apple", "kiwi") //sampleStart fruits .filter { it.startsWith("a") } .sortedBy { it } .map { it.toUpperCase() } .forEach { println(it) } //sampleEnd }
參見(jiàn)高階函數(shù)及Lambda表達(dá)式。