语法记录
写在前面一、题记
本文中的内容全部参考的《Kotlin 官方参考文档 中文版》,本文只是做学习笔记,以供自己及他人学习方便,并不是原创,感谢原创!
写在前面二、main方法在AndroidStudio中直接运行的说明
-
1、创建Kotlin文件
-
2、创建完成后基本上只有包的路径地址,其它什么都没有
- 3、创建main方法
-
4、右键执行
- 查看输出结果
一、方法定义
fun 方法名(形参名称: 形参类型, 形参名称: 形参类型, ...): 返回类型{
方法体
}
注:返回类型如果无:可以忽略或使用Unit类型
二、局部变量定义
- 一次赋值(只读)的局部变量(使用val关键字):
fun method() {
val a: Int = 1 // 立即赋值
val b = 2 // 自动推断出 `Int` 类型
val c: Int // 如果没有初始值类型不能省略
c = 3 // 明确赋值
println("a = $a, b = $b, c = $c")//引用值时使用$符号
}
- 可变变量(使用var关键字):
fun method() {
var x = 5 // 自动推断出 `Int` 类型
x += 1
var d: Int = 33//指定类型为Int类型
d += 2
println("x = $x")
}
三、注释
// 这是一个行注释
/* 这是一个多行的
块注释。 */
与 Java 不同的是,Kotlin 的块注释可以嵌套。
参见编写 Kotlin 代码文档 查看关于文档注释语法的信息
四、字符串模板
- 字符串可以包含模板表达式 ,即一些小段代码,会求值并把结果合并到字符串中。 模板表达式以美元符($)开头,由一个简单的名字构成:
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 """
- 例:
输出结果:a was 1, but now is 2fun method() { var a = 1 // 模板中的简单名称: val s1 = "a is $a" a = 2 // 模板中的任意表达式: val s2 = "${s1.replace("is", "was")}, but now is $a" println(s2) }
五、使用条件表达式
- 例:
//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
作为表达式://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)}") }
六、使用可空值及 null 检测
当某个变量的值可以为
null
的时候,必须在声明处的类型后添加?
来标识该引用可为空。-
如果
str
的内容不是数字返回null
:fun parseInt(str: String): Int? { // …… }
-
使用返回可空值的函数:
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` 可能会报错,因为他们可能为 null if (x != null && y != null) { // 在空检测后,x 和 y 会自动转换为非空值(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 } // 在空检测后,x 和 y 会自动转换为非空值 println(x * y) //sampleEnd } fun main(args: Array<String>) { printProduct("6", "7") printProduct("a", "7") printProduct("99", "b") }
参见空安全。
七、使用类型检测及自动类型转换
-
is
运算符检测一个表达式是否某类型的一个实例。 如果一个不可变的局部变量或属性已经判断出为某类型,那么检测后的分支中可以直接当作该类型使用,无需显式转换:
甚至//sampleStart fun getStringLength(obj: Any): Int? { if (obj is String) { // `obj` 在该条件分支内自动转换成 `String` return obj.length } // 在离开类型检测分支后,`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` 在 `&&` 右边自动转换成 `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) }
八、使用 for 循环
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")
}
}
参见 for 循环。
九、使用 while 循环
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
}
参见 while 循环。
十、使用 when 表达式
//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"))
}
参见 when 表达式。
十一、使用区间(range)
- 使用
in
运算符来检测某个数字是否在指定区间内:fun main(args: Array<String>) { //sampleStart val x = 10 val y = 9 if (x in 1..y+1) { println("fits in range") } //sampleEnd }
- 检测某个数字是否在指定区间外:
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 }
- 区间迭代:
或数列迭代: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 }
参见区间。
十二、使用集合
- 对集合进行迭代:
fun main(args: Array<String>) { val items = listOf("apple", "banana", "kiwi") //sampleStart for (item in items) { println(item) } //sampleEnd }
- 使用
in
运算符来判断集合内是否包含某实例: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 表达式来过滤(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 }