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

基本语法

声明包名

包名应该在源文件顶部

  1. package my.demo
  2. import java.util.*
  3. // ...

包名不要求和必须和文件夹相同的目录,比如一个kotlin源文件路径为src/main/java/com/demo/test.kt,那么包名可以是com.demo.test1 也可以是任意其他的,这点和java不同,java包名必须和代码相对目录相同。 详情 Packages

定义函数

下面这个函数有2个Int类型的参数和Int类型的返回值:

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

函数表达式自动推断返回类型:

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

函数没有返回值(java语法里面的void方法):

  1. fun printSum(a: Int, b: Int): Unit {
  2. print(a + b)
  3. }

Unit 也返回类型可以省略:

  1. public fun printSum(a: Int, b: Int) {
  2. print(a + b)
  3. }

详情 Functions

定义局部变量

赋值一次(只读,类似java语法中final修饰的变量)的变量:

  1. val a: Int = 1
  2. val b = 1 // 自动推断为 Int 类型
  3. val c: Int // 如果没有初始化需要提供类型
  4. c = 1 // 明确的赋值
  5. c = 2 // 会编译出错,val修饰的变量只能赋值一次!

可变变量:

  1. var x = 5
  2. x += 1

详情 Properties And Fields

String 模板

  1. fun main(args: Array<String>) {
  2. if (args.size() == 0) return
  3. print("First argument: ${args[0]}")
  4. }

详情 String templates

条件表达式

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

使用if 表达式

  1. fun max(a: Int, b: Int) = if (a > b) a else b

详情 if-expressions

使用null和检查null

一个引用必须明确可以为null时才有可能为null(如果没有明确声明可以为null,那么强行赋值为null会编译出错!)

如果不能转换成Int 可能返回null:

  1. fun parseInt(str: String): Int? {
  2. // ...
  3. }

调用可能返回null的函数:

  1. fun main(args: Array<String>) {
  2. if (args.size() < 2) {
  3. print("Two integers expected")
  4. return
  5. }
  6. val x = parseInt(args[0])
  7. val y = parseInt(args[1])
  8. //输出 `x * y` 可能会抛出异常,因为x、y可能为null
  9. if (x != null && y != null) {
  10. //x和y都经过了非null检查
  11. print(x * y)
  12. }
  13. }

或者

  1. // ...
  2. if (x == null) {
  3. print("Wrong number format in '${args[0]}'")
  4. return
  5. }
  6. if (y == null) {
  7. print("Wrong number format in '${args[1]}'")
  8. return
  9. }
  10. // ...
  11. print(x * y)

详情 Null-safety

类型检测和自动类型转换

is 关键字检测是否类型相同,如果要检测一个只读的局部变量或属性的特定类型,没有必要明确地强制转换:

  1. fun getStringLength(obj: Any): Int? {
  2. if (obj is String) {
  3. // 在这个if范围内`obj` 自动转换为 `string` 类型
  4. return obj.length
  5. }
  6. // 在外面`obj` 还是`Any`类型
  7. return null
  8. }

或者

  1. fun getStringLength(obj: Any): Int? {
  2. if (obj !is String)
  3. return null
  4. // 这里 `obj` 自动转换成 `String` 类型
  5. return obj.length
  6. }

甚至

  1. fun getStringLength(obj: Any): Int? {
  2. // 在`&&`后面`obj` 将自动转换成 `String` 类型
  3. if (obj is String && obj.length > 0)
  4. return obj.length
  5. return null
  6. }

详情 ClassesType casts

for 循环

  1. fun main(args: Array<String>) {
  2. for (arg in args)
  3. print(arg)
  4. }

或者

  1. for (i in args.indices)
  2. print(args[i])

详情 for loop

while 循环

  1. fun main(args: Array<String>) {
  2. var i = 0
  3. while (i < args.size())
  4. print(args[i++])
  5. }

详情 while loop

when 表达式

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

详情 when expression

ranges

检查一个数字在某个范围内使用in 操作符:

  1. if (x in 1..y-1)
  2. print("OK")

检查一个数字不在某个范围内:

  1. if (x !in 0..array.lastIndex)
  2. print("Out")

遍历ranges:

  1. for (x in 1..5)
  2. print(x)

详情 Ranges

集合

遍历集合:

  1. for (name in names)
  2. println(name)

检查集合里是否包含某个对象用in 操作符:

  1. if (text in names) // 和names.contains(text)一样
  2. print("Yes")

集合高阶函数使用:

  1. names
  2. .filter { it.startsWith("A") }
  3. .sortedBy { it }
  4. .map { it.toUpperCase() }
  5. .forEach { print(it) }

详情 Higher-order functions and Lambdas