📜  科特林 |过滤集合

📅  最后修改于: 2022-05-13 01:55:04.961000             🧑  作者: Mango

科特林 |过滤集合

在 Kotlin 中,过滤是集合处理的一项突出任务。过滤条件由谓词定义——lambda 函数接受一个集合元素并在给定元素与谓词匹配时返回true ,而false表示它与谓词不匹配。

  • 标准库包含许多函数,可让您在一次调用中过滤集合。
  • 这些函数不会更改原始集合的内容,也不会同时用于不可变和可变集合。
  • 我们可以将其赋值给一个变量,或者将过滤后的函数链接起来,对过滤结果进行操作。

按谓词过滤 –

  • 基本函数是filter()用于过滤。
  • 当使用谓词调用filter()函数时,它会返回与谓词匹配的集合元素。
  • 对于ListSet ,结果集合也是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 ,如果集合为空,则返回falsenone()与 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