原文 https://kotlinlang.org/docs/reference/basic-syntax.html
基本语法
声明包名
包名应该在源文件顶部
package my.demoimport java.util.*// ...
包名不要求和必须和文件夹相同的目录,比如一个kotlin源文件路径为src/main/java/com/demo/test.kt,那么包名可以是com.demo.test1 也可以是任意其他的,这点和java不同,java包名必须和代码相对目录相同。
详情 Packages。
定义函数
下面这个函数有2个Int类型的参数和Int类型的返回值:
fun sum(a: Int, b: Int): Int {return a + b}
函数表达式自动推断返回类型:
fun sum(a: Int, b: Int) = a + b
函数没有返回值(java语法里面的void方法):
fun printSum(a: Int, b: Int): Unit {print(a + b)}
Unit 也返回类型可以省略:
public fun printSum(a: Int, b: Int) {print(a + b)}
详情 Functions。
定义局部变量
赋值一次(只读,类似java语法中final修饰的变量)的变量:
val a: Int = 1val b = 1 // 自动推断为 Int 类型val c: Int // 如果没有初始化需要提供类型c = 1 // 明确的赋值c = 2 // 会编译出错,val修饰的变量只能赋值一次!
可变变量:
var x = 5x += 1
String 模板
fun main(args: Array<String>) {if (args.size() == 0) returnprint("First argument: ${args[0]}")}
详情 String templates。
条件表达式
fun max(a: Int, b: Int): Int {if (a > b)return aelsereturn b}
使用if 表达式
fun max(a: Int, b: Int) = if (a > b) a else b
详情 if-expressions。
使用null和检查null
一个引用必须明确可以为null时才有可能为null(如果没有明确声明可以为null,那么强行赋值为null会编译出错!)
如果不能转换成Int 可能返回null:
fun parseInt(str: String): Int? {// ...}
调用可能返回null的函数:
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` 可能会抛出异常,因为x、y可能为nullif (x != null && y != null) {//x和y都经过了非null检查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}// ...print(x * y)
详情 Null-safety。
类型检测和自动类型转换
is 关键字检测是否类型相同,如果要检测一个只读的局部变量或属性的特定类型,没有必要明确地强制转换:
fun getStringLength(obj: Any): Int? {if (obj is String) {// 在这个if范围内`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.lengthreturn null}
详情 Classes和Type casts。
for 循环
fun main(args: Array<String>) {for (arg in args)print(arg)}
或者
for (i in args.indices)print(args[i])
详情 for loop。
while 循环
fun main(args: Array<String>) {var i = 0while (i < args.size())print(args[i++])}
详情 while loop。
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 expression。
ranges
检查一个数字在某个范围内使用in 操作符:
if (x in 1..y-1)print("OK")
检查一个数字不在某个范围内:
if (x !in 0..array.lastIndex)print("Out")
遍历ranges:
for (x in 1..5)print(x)
详情 Ranges。
集合
遍历集合:
for (name in names)println(name)
检查集合里是否包含某个对象用in 操作符:
if (text in names) // 和names.contains(text)一样print("Yes")
集合高阶函数使用:
names.filter { it.startsWith("A") }.sortedBy { it }.map { it.toUpperCase() }.forEach { print(it) }
