Kotlin 集合操作 (Standard Library Functions)
Kotlin 目前擁有非常強大的集合操作 API (類似 Java Stream API,但語法更簡潔)。 這些操作通常使用 Lambda 來定義邏輯。
什麼是 it?
在看下面的範例之前,你可能會一直看到 it 這個字。
it 是 Kotlin Lambda 的一個語法糖。
當 Lambda 只有一個參數 時,你可以省略參數宣告,直接用 it 來代表那個參數。
{ n -> n % 2 == 0 } 可以簡寫成 { it % 2 == 0 }。
Filter (過濾)
保留符合條件的元素。
val numbers = listOf(1, 2, 3, 4, 5, 6)
val evens = numbers.filter { it % 2 == 0 }
// evens: [2, 4, 6]
Map (轉換)
將每個元素轉換成另一個樣子。
val doubled = numbers.map { it * 2 }
// doubled: [2, 4, 6, 8, 10, 12]
ForEach (遍歷)
對每個元素執行動作。
numbers.forEach { println(it) }
搜尋 (Find / First)
find: 找第一個符合的,找不到回傳null。first: 找第一個符合的,找不到拋出 Exception。
val firstEven = numbers.find { it % 2 == 0 } // 2
val notFound = numbers.find { it > 100 } // null
聚合 (Reduce / Fold)
將集合縮減為單一值 (例如總和)。
val sum = numbers.reduce { acc, i -> acc + i }
// acc (Accumulator) 是累加值,i 是當前元素
鏈式呼叫 (Chaining)
你可以把它們全部串起來!
val result = numbers
.filter { it > 2 }
.map { it * it }
.take(2) // 只取前兩個
程式碼就像在寫英文句子一樣流暢。
分組 (groupBy)
將資料依據特定條件分組,回傳 Map<Key, List<T>>。
val names = listOf("Alice", "Bob", "Antony", "Bill")
val groups = names.groupBy { it.first() }
// {'A': ["Alice", "Antony"], 'B': ["Bob", "Bill"]}
效能優化 (Sequences)
如果你有一條很長的鍊式操作 (Chain),且資料量很大,建議轉成 Sequence。 Sequence 是 惰性評估 (Lazy Evaluation) 的,只在需要結果時才計算,且不會產生中間的暫存 List。
names.asSequence()
.filter { it.length > 3 }
.map { it.uppercase() }
.toList() // 最後才轉回 List