基本语法
定义包
包的声明应处于源文件顶部:
package my.demo
import java.util.*
// ...
目录与包的结构无需匹配:源代码可以在文件系统的任意位置
参阅 包.
定义函数
带有两个 Int
参数、返回 Int
的函数:
fun sum(a: Int, b: Int): Int {
return a + b
}
将表达式作为函数体、返回值类型自动推断的函数:
fun sum(a: Int, b: Int) = a + b
函数返回无意义的值:
fun printSum(a: Int, b: Int): Unit {
print(a + b)
}
Unit
返回类型可以省略:
fun printSum(a: Int, b: Int) {
print(a + b)
}
参阅 函数.
定义局部变量
常量(使用 val
关键字声明):
val a: Int = 1
val b = 1 // `Int` 类型自动推断
val c: Int // 如果没有初始值,声明常量时,常量的类型不能省略
c = 1 // 明确赋值
变量(使用 var
关键字声明):
var x = 5 // `自动推断出 Int` 类型
x += 1
参阅 属性和字段.
注释
正如 Java 和 JavaScript,Kotlin 支持行注释及块注释。
// 这是一个行注释
/* 这是一个多行的
块注释。 */
与 Java 不同的是,Kotlin 的块注释可以嵌套。
参见 生成 Kotlin 代码文档 查看关于文档注释语法的信息。
使用字符串模板
fun main(args: Array<String>) {
if (args.size == 0) return
print("First argument: ${args[0]}")
}
参阅 字符串模板.
使用条件判断
fun max(a: Int, b: Int): Int {
if (a > b)
return a
else
return b
}
使用 if 作为表达式:
fun max(a: Int, b: Int) = if (a > b) a else b
参阅 if 表达式.
使用可空值及 null 检查
当某个变量的值可以为 null 的时候,必须在声明处的类型后添加 ? 来标识该引用可为空。
如果 str
的内容不是数字返回 null:
fun parseInt(str: String): Int? {
// ...
}
返回可空值的函数:
fun main(args: Array<String>) {
if (args.size < 2) {
print("Two integers expected")
return
}
val x = parseInt(args[0])
val y = parseInt(args[1])
// 直接使用 `x * y` 可能会报错,因为他们可能为 null
if (x != null && y != null) {
// 在空指针判断后,x 和 y 会自动转换为非空值(non-nullable)
print(x * y)
}
}
或者
// ...
if (x == null) {
print("Wrong number format in '${args[0]}'")
return
}
if (y == null) {
print("Wrong number format in '${args[1]}'")
return
}
// 在空指针判断后,x 和 y 会自动转换为非空值
print(x * y)
参阅 Null 安全性.
使用类型检查及自动类型转换
is 运算符用于类型判断: 检查某个实例是否是某类型。 如果一个局部常量或者不可变的类成员变量已经判断出为某类型,那么判断后的分支中可以直接当作该类型使用,无需显式转换
fun getStringLength(obj: Any): Int? {
if (obj is String) {
// `obj` 在该条件判断分支内自动转换成 `String`
return obj.length
}
// 在离开类型判断分支后, `obj` 仍然是 `Any` 类型
return null
}
或者
fun getStringLength(obj: Any): Int? {
if (obj !is String)
return null
// `obj` 在这一类型判断分支自动转换为 `String`
return obj.length
}
甚至
fun getStringLength(obj: Any): Int? {
// `obj` 在 `&&` 右边自动转换成 `String` 类型
if (obj is String && obj.length > 0)
return obj.length
return null
}
使用 for
循环
fun main(args: Array<String>) {
for (arg in args)
print(arg)
}
或者
for (i in args.indices)
print(args[i])
参阅 for循环.
Using a while
loop
fun main(args: Array<String>) {
var i = 0
while (i < args.size)
print(args[i++])
}
See while 循环.
使用 when
表达式
fun cases(obj: Any) {
when (obj) {
1 -> print("One")
"Hello" -> print("Greeting")
is Long -> print("Long")
!is String -> print("Not a string")
else -> print("Unknown")
}
}
参阅 when表达式.
使用区间(range)
使用 in 运算符来检查某个数字是否在指定区间内:
if (x in 1..y-1)
print("OK")
检查某个数字是否在指定区间外:
if (x !in 0..array.lastIndex)
print("Out")
区间内迭代:
for (x in 1..5)
print(x)
参阅 区间 Range.
使用集合
对集合进行迭代:
for (name in names)
println(name)
使用 in 运算符来判断集合内是否包含某实例:
if (text in names) // 会调用 names.contains(text)
print("Yes")
使用 lambda 表达式来过滤(filter)和变换(map)集合:
names
.filter { it.startsWith("A") }
.sortedBy { it }
.map { it.toUpperCase() }
.forEach { print(it) }
参阅 高阶函数及Lambda表达式.