1. filter 函數的作用
filter
是 Kotlin 集合操作中的一個高階函數,用于根據指定條件從集合中篩選出符合條件的元素。
- 作用:遍歷集合中的每個元素,并通過給定的
lambda
表達式判斷是否保留該元素。 - 返回值:一個新的集合,只包含滿足條件的元素。
- 惰性操作:僅在需要時才會處理全部數據(對于
Sequence
)。 - 常用于:數據過濾、清洗、查詢等場景。
2. 使用場景
場景 1:基礎數據過濾
從字符串或數值集合中篩選符合特定條件的數據。
示例代碼:
val numbers = listOf(1, 2, 3, 4, 5)
val evenNumbers = numbers.filter { it % 2 == 0 }
println(evenNumbers) // 輸出: [2, 4]
場景 2:結合 flatMap 進行嵌套結構過濾
對嵌套集合進行扁平化后過濾,提取所有符合條件的元素。
上下文代碼片段優化:
var nameList = listOf(listOf("huang xao ming", "li lian jie", "li xao long"),listOf("liu jun", "li yuan ba", "liu ming"),listOf("liu jia", "huang jia ju", "huang fei hong"))
nameList.flatMap { group ->group.filter { name -> name.contains("liu") }
}.map {print("$it ")
}
// 輸出: liu jun liu ming liu jia (假設原始數據無多余空格)
此方式將多個子列表合并成一個列表后再做統一過濾,適用于多組數據統一篩選。
場景 3:對象集合中按屬性過濾
當集合元素為對象時,可基于對象的某個屬性進行過濾。
示例代碼:
data class User(val name: String, val age: Int)val users = listOf(User("Alice", 25),User("Bob", 17),User("Charlie", 30)
)val adults = users.filter { it.age >= 18 }
println(adults) // 輸出: [User(name=Alice, age=25), User(name=Charlie, age=30)]
場景 4:鏈式調用組合邏輯
與 map
、sortedBy
等函數配合使用,實現復雜的數據處理流程。
示例代碼:
val filteredNames = users.filter { it.age >= 18 }.map { it.name }.sorted()
println(filteredNames) // 輸出: [Alice, Charlie]
3. filter 相關變體函數
函數名 | 功能說明 |
---|---|
filter | 根據條件保留元素 |
filterNot | 反向過濾,保留不滿足條件的元素 |
filterNotNull | 過濾掉集合中的 null 值 |
filterIsInstance<T> | 提取集合中指定類型的元素 |
示例代碼:
val mixedList = listOf("apple", null, 42, "banana", 3.14)
val stringsOnly = mixedList.filterIsInstance<String>()
println(stringsOnly) // 輸出: [apple, banana]
4. 總結
filter
是 Kotlin 中非常實用的函數,能夠幫助開發者快速實現數據篩選和清洗。無論是在簡單的字符串/數字集合,還是復雜的對象集合中,都可以通過 filter
實現高效的數據處理。結合 map
、flatMap
等函數,可以構建出功能強大的數據轉換流程,提升開發效率和代碼可讀性。