過濾操作
在處理集合時,根據特定條件過濾集合或檢查集合中是否包含符合特定條件的元素是軟件開發中的常見任務。為了解決這個問題,我們可以使用 Kotlin 中實現的函數式 API。
在本主題中,我們將介紹如何使用謂詞過濾集合,并獲得滿足給定謂詞的新集合。
過濾
Kotlin 提供了一個函數式 API,它使用擴展函數,允許我們根據謂詞過濾集合中的元素。filter()
函數接受一個謂詞,并返回一個新的集合,其中包含滿足謂詞(或條件)的元素。此外,我們還可以使用 filterIndexed()
,該函數接受元素的索引和元素本身,并返回一個符合謂詞的集合。還有 filterNot()
,它返回一個不滿足謂詞的集合。這些方法適用于所有基本的 Kotlin 集合(列表、集合和映射)。
val isEven: (Int) -> Boolean = { x -> x % 2 == 0 }fun main() {val numbers = listOf(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10)// 獲取偶數列表println(numbers.filter { x -> x % 2 == 0 }) // [0, 2, 4, 6, 8, 10]println(numbers.filter { isEven(it) }) // [0, 2, 4, 6, 8, 10]println(numbers.filter(isEven)) // [0, 2, 4, 6, 8, 10]// 獲取奇數列表println(numbers.filter { x -> x % 2 != 0 }) // [1, 3, 5, 7, 9]// 使用 filterNot 獲取奇數列表println(numbers.filterNot { x -> x % 2 == 0 }) // [1, 3, 5, 7, 9]// 獲取索引大于 3 且為偶數的數字println(numbers.filterIndexed { i, number -> i > 3 && number % 2 == 0 }) // [4, 6, 8, 10]// 獲取索引為奇數且以 "k" 開頭的單詞val words = listOf("peter", "kyle", "robert", "kate", "kevin", "anne", "jeremy")println(words.filterIndexed { i, word -> i % 2 != 0 && word.startsWith("k") }) // [kyle, kate]
}
解釋代碼
函數式編程中的 filter
函數是一個有效的工具,它可以代替命令式編程中的 for
和 if
:
fun main() {val numbers = listOf(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10)val even = numbers.filter { x -> x % 2 == 0 }val odd = mutableListOf<Int>()for (i in numbers) {if (i % 2 != 0) {odd.add(i)}}println(even) // [0, 2, 4, 6, 8, 10]println(odd) // [1, 3, 5, 7, 9]
}
過濾和類型
我們還可以使用一些函數,通過元素的類型來過濾集合。filterIsInstance()
函數根據給定的類型謂詞返回一個新的集合,filterNotNull()
函數則返回所有非 null 元素。
filterIsInstance
函數不接受一個顯式的謂詞函數,而是通過類型參數來指定過濾的類型。
fun main() {val elements = listOf(null, 0, "string", 3.14, null, 'c', "Luke")// 只獲取字符串元素println(elements.filter { x -> x is String }) // [string, Luke]println(elements.filterIsInstance<String>()) // [string, Luke]// 獲取非 null 元素println(elements.filterNot { x -> x == null }) // [0, string, 3.14, c, Luke]println(elements.filterNotNull()) // [0, string, 3.14, c, Luke]// 獲取整型元素println(elements.filterIsInstance<Int>()) // [0]
}
分區
partition()
函數將原始集合分為兩個部分:一個包含符合謂詞的元素,另一個包含不符合謂詞的元素。
fun main() {val numbers = listOf(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10)val (even, odd) = numbers.partition { x -> x % 2 == 0 }println(even) // [0, 2, 4, 6, 8, 10]println(odd) // [1, 3, 5, 7, 9]
}
解釋代碼
上述代碼通過 partition()
函數將數字集合分成了兩個部分:一個包含偶數,另一個包含奇數。
結論
在本主題中,我們介紹了根據 條件(即謂詞) 過濾集合元素的不同方法。
我們介紹了幾種特殊的函數來過濾元素,如 filter()
、filterIndexed()
、filterNot()
、filterIsInstance()
、filterNotNull()
和 partition()
。它們為我們提供了一種優雅且高效的方式來過濾集合元素。