前言
23年底读了一遍“Kotlin官方文档”,官方文档大而全,阅读下来,大有裨益。
此系列文章的目的是记录学习进程,同时,若能让读者迅速掌握重点内容并快速上手,那就再好不过了。
函数
带有两个 Int
参数、返回 Int
的函数。Unit返回值类型可省略。
fun sum(x: Int, y: Int): Int {return x + y
}
将表达式作为函数体、返回值类型自动推断的函数:
fun sum(x: Int, y: Int) = x + y
变量
val:不可变变量,val变量相当于Java中的final变量。优先使⽤val来避免副作⽤。副作用的产生往往与可变数据及共享状态有关。
val a: Int = 1 // 立即赋值
val b = 2 // 自动推断出 `Int` 类型
val c: Int // 如果没有初始值类型不能省略
c = 3 // 明确赋值
var:可变变量,一般用于声明局部变量。
var x = 5 // 自动推断出 `Int` 类型
x += 1
字符串模板
字符串模板使用美元符号($)和花括号({})来嵌入变量或表达式。
var a = 1
val s1 = "a is $a"
println(s1) //输出:a is 1a =2
val s2 = "${s1.replace("is", "was")}, but now is $a"
println(s2) //输出:a was 1, but now is 2
条件表达式
if..else...
fun maxOf(x: Int, y: Int): Int {if (x > y) {return x} else {return y}
}fun maxOf(x: Int, y: Int): Int = if (x > y) x else y
when
表达式
fun describe(obj: Any): String =when (obj) {1 -> "One""Hello" -> "Greeting"is Long -> "Long"!is String -> "Not a string"else -> "Unknown"}
空值与 null 检测
编译时检查和处理空引用,避免出现空指针异常。
可空类型 | ? | 安全转换操作符 | as? | Else操作符 | ?: |
安全操作符 | ?. | 非空断言操作符 | !! |
fun main() {val nullableString: String? = nullval nonNullString: String? = "Hello"// 安全调用操作符 (?.)println(nullableString?.length) // 输出: nullprintln(nonNullString?.length) // 输出: 5// 安全转换操作符 (as?)val tmpStr: Any? = nullval length: String? = tmpStr as? Stringprintln(length) // 输出: null// 非空断言操作符 (!!)try {val length2: Int = nullableString!!.lengthprintln(length2)} catch (e: NullPointerException) {println("发生了空指针异常")}// Else操作符 (?:)val result = nullableString ?: "默认值"println(result) // 输出: 默认值
}
类型检测与自动类型转换
is运算符检测一个表达式是否是某类型的示例,如果已经判断为A类型,则检测分支可以直接当A类型使用。
fun getStringLength(obj: Any): Int? {if (obj is String) {// `obj` 在该条件分支内自动转换成 `String`return obj.length}// 在离开类型检测分支后,`obj` 仍然是 `Any` 类型return null
}
循环
for
循环:
fun main() {val list = listOf("apple", "banana", "otherfruit")for (item in list) {println(item)}for (index in list.indices) {println("item at $index is ${list[index]}")}
}
输出:
apple
banana
otherfruit
item at 0 is apple
item at 1 is banana
item at 2 is otherfruit
while循环:
fun main() {val list = listOf("apple", "banana", "otherfruit")var index = 0while (index < list.size) {println("item at $index is ${list[index]}")index++}
}
范围
使用 in 、step、downTo等运算符。
fun main() {val x = 9val y = 10//使用 in 运算符来检测某个数字是否在指定区间内if (x in 1..y+1) {println("fits in range")}//区间迭代for (x in 1..5) {print(x)}println()//数列迭代for (x in 1..10 step 2) {print(x)}println()for (x in 9 downTo 0 step 3) {print(x)}
}
输出:
fits in range
12345
13579
9630
集合
集合提供了循环遍历、判断是否包含其中、Lambda表达式表示过滤和映射等能力。
fun main() {val fruits = listOf("banana", "avocado", "apple", "kiwifruit")//对集合进行循环遍历for (item in fruits) {println(item)}//使用in运算符判断集合是否包含某实例when {"orange" in fruits -> println("juicy")"apple" in fruits -> println("apple juice")}//Lambda表达式表示过滤和映射组合。fruits.filter { it.startsWith("a") }.sortedBy { it }.map { it.toUpperCase() }.forEach{println(it)}
}
输出:
banana
avocado
apple
kiwifruit
apple juice
APPLE
AVOCADO
创建基本类及其实例
val rectangle = Rectangle(5.0, 2.0)