# kotlin筆記
kotlin就一個很像Java的程式
但為甚麼我要用kotlin呢...因為Android官網教學就用kotlin顆顆...
[TOC]
## 輸出
```kotlin=
println("hellow world");
```
## 變數
* 使用 val 關鍵字來定義唯讀變數,而它的值在指定後是無法變更。
* 使用 var 關鍵字來定義可變的或常變的變數。
盡量使用val而非var
## 變數轉換
### 轉換 Array ⇄ List
```kotlin=
val array = arrayOf(1, 2, 3)
val list = array.toList() // 陣列轉 List
val newArray = list.toTypedArray() // List 轉陣列
```
### Int 轉 String
```kotlin=
val num = 123
val str = num.toString()
println(str) // "123"
```
### String 轉 Int
```kotlin=
val str = "456"
val num = str.toInt()
println(num) // 456
```
⚠️注意:如果 String 不是有效的數字,轉換時會拋出 NumberFormatException,可以使用 toIntOrNull() 避免錯誤:
```kotlin=
val invalidStr = "abc"
val numOrNull = invalidStr.toIntOrNull()
println(numOrNull) // null
```
## 函式
```kotlin=
fun main() {
println("Hello, world!!!")
}
fun add(a: Int, b: Int): Int {
return a + b
}
```
## 判斷式
### if/else
```kotlin=
val num = 10
if (num > 0) {
println("Positive")
} else if (num < 0) {
println("Negative")
} else {
println("Zero")
}
```
Kotlin 的 if 是表達式,可以返回值:
```kotlin=
val a = 10
val b = 20
val max = if (a > b) a else b
println(max) // 20
```
### when
可以作為表達式使用,很像if/else
```kotlin=
val num = 10
val result = when {
num > 0 -> "Positive"
num < 0 -> "Negative"
else -> "Zero"
}
println(result) // Positive
```
## 迴圈
### for
```kotlin=
for (i in 1..5) {
println(i) // 1 2 3 4 5
}
for (i in 1 until 5) { // 不包含 5
println(i) // 1 2 3 4
}
for (i in 5 downTo 1) {
println(i) // 5 4 3 2 1
}
for (i in 1..10 step 2) {
println(i) // 1 3 5 7 9
}
```
### while
```kotlin=
var x = 5
while (x > 0) {
println(x)
x--
}
```
### 類與物件
```kotlin=
class Person(val name: String, var age: Int) {
fun introduce() {
println("Hi, I'm $name and I'm $age years old.")
}
}
fun main() {
val person = Person("Alice", 25)
person.introduce() // Hi, I'm Alice and I'm 25 years old.
}
```
## 亂數生成
```kotlin=
import kotlin.random.Random
fun main() {
val randomInt = Random.nextInt(1, 100) // 生成 1 到 99 之間的隨機整數
val randomDouble = Random.nextDouble(0.0, 1.0) // 生成 0.0 到 1.0 之間的隨機小數
val randomBoolean = Random.nextBoolean() // 生成 true 或 false
println("Random Int: $randomInt")
println("Random Double: $randomDouble")
println("Random Boolean: $randomBoolean")
}
```
## 陣列 (Array)
### 宣告與初始化
```kotlin=
val numbers = arrayOf(1, 2, 3, 4, 5) // 自動推斷型別
val words = arrayOf("Apple", "Banana", "Cherry")
// 指定型別
val intArray = intArrayOf(10, 20, 30)
val doubleArray = doubleArrayOf(1.1, 2.2, 3.3)
// 指定長度 (預設值為 0)
val emptyArray = Array(5) { 0 } // [0, 0, 0, 0, 0]
val squareNumbers = Array(5) { it * it } // [0, 1, 4, 9, 16]
```
### 存取與修改
```kotlin=
println(numbers[0]) // 1
numbers[1] = 99 // 修改索引 1 的值
println(numbers[1]) // 99
```
## 列表 (List)
### List (不可變,內容不能修改)
```kotlin=
val fruits = listOf("Apple", "Banana", "Cherry")
println(fruits[0]) // Apple
println(fruits.size) // 3
```
❌ fruits[0] = "Orange" (錯誤,因為 listOf 生成的是不可變列表)
### MutableList (可變,內容可修改)
```kotlin=
val numbers = mutableListOf(1, 2, 3)
numbers.add(4) // 新增元素
numbers.removeAt(0) // 移除索引 0 的元素
numbers[1] = 99 // 修改索引 1 的值
println(numbers) // [2, 99, 4]
```
### 排序與篩選
```kotlin=
val nums = mutableListOf(5, 2, 8, 1, 3)
nums.sort() // 升序排序
println(nums) // [1, 2, 3, 5, 8]
val filtered = nums.filter { it > 2 } // 篩選大於 2 的元素
println(filtered) // [3, 5, 8]
```
## try/catch
```kotlin=
fun main() {
try {
val num = "abc".toInt() // 這行會拋出 NumberFormatException
println(num)
} catch (e: NumberFormatException) {
println("轉換失敗: ${e.message}")
}
}
```
* try 區塊內的程式碼可能會拋出異常。
* catch 區塊捕獲異常,防止程式崩潰。
* e.message 取得錯誤訊息。
```kotlin=
val num = try {
"123".toInt() // 轉換成功返回 123
} catch (e: NumberFormatException) {
-1 // 轉換失敗時返回 -1
}
println(num) // 123
```
### 多個 catch
```kotlin=
fun main() {
try {
val list = listOf(1, 2, 3)
println(list[5]) // 這行會拋出 IndexOutOfBoundsException
} catch (e: NumberFormatException) {
println("數字格式錯誤: ${e.message}")
} catch (e: IndexOutOfBoundsException) {
println("索引超出範圍: ${e.message}")
}
}
```
* catch 可以有多個,從上到下依序匹配。
* 當符合對應的異常類型時,會執行該 catch,並忽略後續 catch。
### try/catch/finally
finally 區塊內的程式碼無論是否發生異常都會執行,常用於 釋放資源(如關閉檔案、資料庫連線等)。
```kotlin=
fun main() {
try {
val result = 10 / 0 // 會拋出 ArithmeticException
println(result)
} catch (e: ArithmeticException) {
println("數學運算錯誤: ${e.message}")
} finally {
println("程式執行結束")
}
}
```