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