kotlin01 基本语法

摘要:kotlin基本语法
Abstract: kotlin basic syntax

定义package

包定义需要在文件开头,不需要和文件系统路径一致。

1
2
3
package my.demo

import java.util.*

定义function

1
2
3
fun sum(a: Int, b: Int): Int {
return a + b
}

函数可以是一个表达式,返回类型由编译器推断:

1
fun sum(a: Int, b: Int) = a + b

无返回值的函数返回Unit对象。

1
2
3
fun printSum(a: Int, b: Int): Unit {
println("sum of $a and $b is ${a + b}")
}

Unit可以被省略。

1
2
3
fun printSum(a: Int, b: Int) {
println("sum of $a and $b is ${a + b}")
}

定义变量(Variables)

只读变量:

1
2
3
4
val a: Int = 1  // 定义变量时复制
val b = 2 // 类型推断:`Int`
val c: Int // 没有立即赋值需要显式指定变量类型
c = 3 // deferred assignment

可变变量:

1
2
var x = 5 // `Int` type is inferred
x += 1

注释(Comments)

kotlin的注释可以嵌套

1
2
3
4
// 单行注释

/* 块注释,
可以包含多行 */

字符串模板(string templates)

1
2
3
4
5
6
7
8
var a = 1
// 简单变量模板:
val s1 = "a is $a"

a = 2

// 模板中包含表达式
val s2 = "${s1.replace("is", "was")}, but now is $a"

条件表达式(conditional expressions)

1
2
3
4
5
6
7
fun maxOf(a: Int, b: Int): Int {
if (a > b) {
return a
} else {
return b
}
}
1
fun maxOf(a: Int, b: Int) = if (a > b) a else b

检查null

如果函数返回null,必须显式在返回值类型后面加上?

1
2
3
fun parseInt(str: String): Int? {
// ...
}
1
2
3
4
5
6
7
8
9
10
11
12
13
fun printProduct(arg1: String, arg2: String) {
val x = parseInt(arg1)
val y = parseInt(arg2)

// 直接计算 `x * y` 会产生编译错误,因为x和y可能是null
if (x != null && y != null) {
// x 和 y 检查null之后会自动转型成非空类型(non-nullable)
println(x * y)
}
else {
println("either '$arg1' or '$arg2' is not a number")
}
}

类型检查和自动转型

is操作符可以用来检查对象是否属于某种类型,非可变本地变量或者属性在做完类型检查之后,会在分支内自动转成目标类型。

1
2
3
4
5
6
7
8
9
fun getStringLength(obj: Any): Int? {
if (obj is String) {
// `obj` 自动转型成 `String`
return obj.length
}

// `obj` 类型在这里是`Any`
return null
}

或者

1
2
3
4
5
6
fun getStringLength(obj: Any): Int? {
if (obj !is String) return null

// `obj` 自动转型成 `String`
return obj.length
}

甚至

1
2
3
4
5
6
7
8
fun getStringLength(obj: Any): Int? {
// `obj` 在 `&&` 操作符的右侧被自动转型成 `String`类型
if (obj is String && obj.length > 0) {
return obj.length
}

return null
}

for循环

1
2
3
4
val items = listOf("apple", "banana", "kiwifruit")
for (item in items) {
println(item)
}

或者

1
2
3
4
val items = listOf("apple", "banana", "kiwifruit")
for (index in items.indices) {
println("item at $index is ${items[index]}")
}

while循环

1
2
3
4
5
6
val items = listOf("apple", "banana", "kiwifruit")
var index = 0
while (index < items.size) {
println("item at $index is ${items[index]}")
index++
}

when 表达式

1
2
3
4
5
6
7
8
fun describe(obj: Any): String =
when (obj) {
1 -> "One"
"Hello" -> "Greeting"
is Long -> "Long"
!is String -> "Not a string"
else -> "Unknown"
}

range

使用in操作符来判断变量是否在范围内, !in判断是否在范围外

1
2
3
4
5
val x = 10
val y = 9
if (x in 1..y+1) {
println("fits in range")
}
1
2
3
4
5
6
7
8
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")
}

迭代

1
2
3
for (x in 1..5) {
print(x)
}

设置迭代步长

for (x in 1..10 step 2) {
print(x)
}
println()
for (x in 9 downTo 0 step 3) {
print(x)
}

使用集合类

迭代

1
2
3
for (item in items) {
println(item)
}

判断元素是否存在于集合中

1
2
3
4
when {
"orange" in items -> println("juicy")
"apple" in items -> println("apple is fine too")
}

fitler and map

1
2
3
4
5
fruits
.filter { it.startsWith("a") }
.sortedBy { it }
.map { it.toUpperCase() }
.forEach { println(it) }

参考

  1. https://kotlinlang.org/docs/reference/basic-syntax.html