科特林 |过滤集合
在 Kotlin 中,过滤是集合处理的一项突出任务。过滤条件由谓词定义——lambda 函数接受一个集合元素并在给定元素与谓词匹配时返回true ,而false表示它与谓词不匹配。
- 标准库包含许多函数,可让您在一次调用中过滤集合。
- 这些函数不会更改原始集合的内容,也不会同时用于不可变和可变集合。
- 我们可以将其赋值给一个变量,或者将过滤后的函数链接起来,对过滤结果进行操作。
按谓词过滤 –
- 基本函数是filter()用于过滤。
- 当使用谓词调用filter()函数时,它会返回与谓词匹配的集合元素。
- 对于List和Set ,结果集合也是List但对于Map它将返回 Map。
Kotlin 程序在 list 和 Map 集合上使用过滤函数-
Java
fun main(args: Array)
{
//declaring a list of elements
val list = listOf("geeks","for","geeks","hello","world")
//filtering all words with length > 4
val longerThan4 = list.filter { it.length > 4 }
println(longerThan4)
//declaring a map of string to integers
val numbersMap = mapOf("key13" to 10, "key25" to 20,
"key34" to 30, "key45" to 40, "key55" to 50 )
//filtering the map with some predicates
val filteredMap = numbersMap.filter { (key, value) ->
key.endsWith("5") && value > 20}
println(filteredMap)
}
Java
fun main(args: Array) {
val words = listOf("geek","for","geeks","all","world")
//filtering a list by : words having length < 6 and index != 0
val filteredIndex = words.filterIndexed { index, s ->
(index != 0) && (s.length < 6) }
//filtering words having length >=3 using filterNot
val filteredNot = words.filterNot { it.length <= 3 }
println(filteredIndex)
println(filteredNot)
}
Java
fun main(args: Array) {
val words = listOf("geek","for","geeks","hello","world")
//partitioning the words by length > 4 and length <= 4
val (first, second) = words.partition { it.length > 4 }
println(first)
println(second)
}
Java
fun main(args: Array) {
val words = listOf("geeks","for","geeeks","hello","world")
//checking if atleast one word ends with s or not
println("Any element matches? "+words.any { it.endsWith("s") })
//checking if no word ends with a or not
println("No element matches? "+words.none { it.endsWith("a") })
println("All element match? "+words.all { it.endsWith("d") })
//checking if all words end with d or not
//when predicate is empty, it checks for emptiness
println(words.any())
println(words.none())
//all function on an empty list
println(emptyList().all { it > 5 }) // vacuous truth
val empty = emptyList()
//any function on an empty list returns false
println(empty.any())
//none function on an empty list returns true
println(empty.none())
}
输出:
[geeks, geeks, hello, world]
{key45=40, key55=50}
过滤器()的变化
- 如果我们想使用元素索引或位置进行过滤,我们必须使用filterIndexed() 。
- filterIndexed()函数接受一个带有两个参数的谓词:索引和元素的值。
- 我们可以使用filterNot()按否定条件过滤集合。
使用 filterIndexed() 和 filterNot() 函数的 Kotlin 程序 –
Java
fun main(args: Array) {
val words = listOf("geek","for","geeks","all","world")
//filtering a list by : words having length < 6 and index != 0
val filteredIndex = words.filterIndexed { index, s ->
(index != 0) && (s.length < 6) }
//filtering words having length >=3 using filterNot
val filteredNot = words.filterNot { it.length <= 3 }
println(filteredIndex)
println(filteredNot)
}
输出:
[for, geeks, all, world]
[geek, geeks, world]
分区 –
还有另一个过滤函数partition()通过谓词过滤集合并将所有与谓词不匹配的元素分开并放入不同的列表中。
基本上,它返回一对列表:第一个列表包含与谓词匹配的元素,第二个列表包含原始集合中与谓词不匹配的所有元素。
使用分区的 Kotlin 程序 –
Java
fun main(args: Array) {
val words = listOf("geek","for","geeks","hello","world")
//partitioning the words by length > 4 and length <= 4
val (first, second) = words.partition { it.length > 4 }
println(first)
println(second)
}
输出:
[geeks, hello, world]
[geek, for]
测试谓词 –
针对集合元素测试谓词的一些函数如下:
- any() :如果至少一个元素与给定的谓词匹配,则返回true 。
- none() :如果没有任何元素与给定的谓词匹配,则返回true 。
- all() :如果集合的所有元素都与给定的谓词匹配,则返回true 。
注意:当使用空集合上的任何有效谓词调用all()时,将返回true 。这被称为空洞的真理。
我们可以在没有谓词的情况下使用any()和none() ,它只会检查集合是否为空,即如果集合有元素, any()将返回true ,如果集合为空,则返回false ; none()与 any() 正好相反。
使用 any()、none() 和 all() 函数的 Kotlin 程序 –
Java
fun main(args: Array) {
val words = listOf("geeks","for","geeeks","hello","world")
//checking if atleast one word ends with s or not
println("Any element matches? "+words.any { it.endsWith("s") })
//checking if no word ends with a or not
println("No element matches? "+words.none { it.endsWith("a") })
println("All element match? "+words.all { it.endsWith("d") })
//checking if all words end with d or not
//when predicate is empty, it checks for emptiness
println(words.any())
println(words.none())
//all function on an empty list
println(emptyList().all { it > 5 }) // vacuous truth
val empty = emptyList()
//any function on an empty list returns false
println(empty.any())
//none function on an empty list returns true
println(empty.none())
}
输出:
Any element matches? true
No element matches? true
All element match? false
true
false
true
false
true