# 基本語法
## 定義包
包應該在源文件的頂部指定:
``` kotlin
package my.demo
import java.util.*
// ...
```
無需匹配對應的目錄和包:源文件可以放置在文件系統中任何地方。
查看 [包定義](../basics/packages.md)。
## 定義函數
有兩個`Int`參數并返回`Int`類型的函數:
``` kotlin
fun sum(a: Int, b: Int): Int {
return a + b
}
```
只有一個表達式函數體、推斷返回類型的函數:
``` kotlin
fun sum(a: Int, b: Int) = a + b
```
不返回具體值的函數:
``` kotlin
fun printSum(a: Int, b: Int): Unit {
print(a + b)
}
```
`Unit` 返回類型可以省略:
``` kotlin
fun printSum(a: Int, b: Int) {
print(a + b)
}
```
查看 [函數](../functions-and-lambdas/functions.md).
## 定義本地變量
一次性分配(只讀)的本地變量:
``` kotlin
val a: Int = 1
val b = 1 // `Int` 類型靠推斷得出
val c: Int // 未初始化時必須指定類型
c = 1 // 明確地分配
```
可變的變量值:
``` kotlin
var x = 5 // `Int` 類型靠推斷得出
x += 1
```
參閱 [屬性和字段](properties.html).
## 注釋
與 Java 和 JavaScript 類似,Kotlin 支持行尾和塊注釋。
``` kotlin
// 這是一個行尾注釋
/* 這是一個
多行塊注釋*/
```
與 Java 不同的是,在 Kotlin 中塊注釋可以嵌套。
查看 [Kotlin 代碼文檔](kotlin-doc.html) 了角注釋語法。
## 使用字符串模板
``` kotlin
fun main(args: Array<String>) {
if (args.size == 0) return
print("First argument: ${args[0]}")
}
```
查看 [String 模板](basic-types.html#string-templates).
## 使用條件表達式
``` kotlin
fun max(a: Int, b: Int): Int {
if (a > b)
return a
else
return b
}
```
像表達式一樣使用 `if` 句式:
``` kotlin
fun max(a: Int, b: Int) = if (a > b) a else b
```
查看 [if 表達式](control-flow.html#if-expression).
## 使用可空的值并檢測 `null`
當值可空時必須明確地加以標記。
如果 `str` 不是一個表示整數的字符串則返回 `null` :
``` kotlin
fun parseInt(str: String): Int? {
// ...
}
```
用一個函數返回可空值:
``` kotlin
fun main(args: Array<String>) {
if (args.size < 2) {
print("Two integers expected")
return
}
val x = parseInt(args[0])
val y = parseInt(args[1])
// 因為有可能保存 `null` ,所以使用 `x * y` 會產生錯誤。
if (x != null && y != null) {
// 在空值檢查后x 和 y 自動轉換成不可空
print(x * y)
}
}
```
或者寫成這樣:
``` kotlin
// ...
if (x == null) {
print("${args[0]} 數字格式錯誤")
return
}
if (y == null) {
print("${args[1]} 數字格式錯誤")
return
}
// x 和 y 會在空值檢查后自動轉換為不可空
print(x * y)
```
查看 [Null 安全](null-safety.html).
## 使用類型檢查與自動轉換
`is` 運算符檢查一個表達式是否是另一個類型的實例。
如果一個不可變的本地變量或屬性被檢測為一個特定的類型,則不需要明確地轉換它:
``` kotlin
fun getStringLength(obj: Any): Int? {
if (obj is String) {
// 在這個作用域中 obj 會自動轉換為 String
return obj.length
}
// 在類型檢查的作用域之外, obj 的類型仍然為 Any
branch
return null
}
```
或者是:
``` kotlin
fun getStringLength(obj: Any): Int? {
if (obj !is String)
return null
// 在這個作用域中 obj 會自動轉換為 String
return obj.length
}
```
甚至可以這樣寫:
``` kotlin
fun getStringLength(obj: Any): Int? {
// 在 && 運算符右邊 obj 會自動轉換為 String
if (obj is String && obj.length > 0)
return obj.length
return null
}
```
查看 [類](classes.html) 和 [類型轉換](typecasts.html).
## 使用 `for` 循環
``` kotlin
fun main(args: Array<String>) {
for (arg in args)
print(arg)
}
```
或者:
``` kotlin
for (i in args.indices)
print(args[i])
```
查看 [for 循環](control-flow.html#for-loops).
## 使用 `while` 循環
``` kotlin
fun main(args: Array<String>) {
var i = 0
while (i < args.size)
print(args[i++])
}
```
查看 [while 循環](control-flow.html#while-loops).
## 使用 `when` 表達式
``` kotlin
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 表達式](control-flow.html#when-expression).
## 使用“范圍”
要檢查某個數字是否在某個范圍內,使用 `in` 操作符:
``` kotlin
if (x in 1..y-1)
print("OK")
```
檢查某個數字是否在某個范圍之外:
``` kotlin
if (x !in 0..array.lastIndex)
print("Out")
```
范圍迭代:
``` kotlin
for (x in 1..5)
print(x)
```
查看 [范圍](ranges.html).
## 使用集合
迭代集合:
``` kotlin
for (name in names)
println(name)
```
要檢查某個集合是否包含某個對象,使用 `in` 操作符:
``` kotlin
if (text in names) // names.contains(text) is called
print("Yes")
```
使用 lambda 表達式來過濾和映射集合:
``` kotlin
names
.filter { it.startsWith("A") }
.sortedBy { it }
.map { it.toUpperCase() }
.forEach { print(it) }
```
查看 [高階函數和 Lambda](lambdas.html).