📜  科特林 |检索收集部件

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

科特林 |检索收集部件

Kotlin 提供了用于检索集合部件的扩展函数。在类之外定义的成员函数称为扩展函数。这些扩展功能可以提供多种方式来从列表中选择不同的项目。
四个扩展功能是:

  • 取放
  • 分块
  • 开窗的

切片函数就像在其他语言中一样工作,它返回具有给定索引的项目列表。这些索引可以作为范围或整数值传递。
演示切片的 Kotlin 示例 -

fun main(args: Array) {
    val fruits = listOf("apple", "banana", "cherries",
        "dragon_fruit", "egg_fruit", "fig")
    println(fruits.slice(1..4))
    println(fruits.slice(0..4 step 2))
    println(fruits.slice(setOf(1, 2, 4)))
}

输出:

[banana, cherries, dragon_fruit, egg_fruit]
[apple, cherries, egg_fruit]
[banana, cherries, egg_fruit]

取放

顾名思义, take()函数可以从一开始就获取指定数量的项目。如果我们想从最后获取项目,我们可以调用takeLast()函数。
类似地, drop()函数从开头获取除指定数量的项目之外的所有项目,而dropLast()从最后获取除指定数量的项目之外的所有项目。

Kotlin 示例来演示 take 和 drop -

fun main(args: Array) {
    val fruits = listOf("apple", "banana", "cherries",
        "dragon_fruit", "egg_fruit", "fig")
    println(fruits.take(3))
    println(fruits.takeLast(3))
    println(fruits.drop(4))
    println(fruits.dropLast(4))
}

输出:

[apple, banana, cherries]
[dragon_fruit, egg_fruit, fig]
[egg_fruit, fig]
[apple, banana]

take 和 drop 中有四个函数,我们可以使用谓词来定义要取出和丢弃的项目数。

Kotlin 程序 –

fun main(args: Array) {
    val fruits = listOf("apple", "banana", "cherries",
        "dragon_fruit", "egg_fruit", "fig")
  
    //takeWhile() takes the items upto but 
    // excluding the first one not matching the predicate.
    println(fruits.takeWhile{!it.startsWith("d")})
  
    //takeLastWhile() takes a range of items 
    // matching the predicate from the end.
    println(fruits.takeLastWhile{it != "cherries"})
  
    //dropWhile() returns the items from first
    // one not matching the predicate to the end.
    println(fruits.dropWhile{it.length == 5})
  
    //dropWhileLast() returns element from the 
    // beginning to the last one not matching the predicate.
    println(fruits.dropLastWhile{it.contains("i")})
}

输出:

[apple, banana, cherries]
[dragon_fruit, egg_fruit, fig]
[banana, cherries, dragon_fruit, egg_fruit, fig]
[apple, banana]

分块

分块是一种函数,通过该功能,列表的各个部分被分解,然后组合在一起成为指定的块大小。 chunk()函数采用单个参数并返回该块大小的列表。

我们还可以对返回的块应用转换。为了做到这一点,我们在调用 chunked() 时将转换作为 lambda函数提供。当使用转换调用chunked()时,块是短暂的列表,应该在 lambda 表达式中用于其他目的。

使用 chunk()函数的 Kotlin 程序 –

fun main(args: Array) {
    val fruits = listOf("apple", "banana", "cherries",
        "dragon_fruit", "egg_fruit", "fig")
    // chunks into list size of three
    println(fruits.chunked(3))
  
    // lambda function to sum the elements
    val numbers = (0..11).toList()
    println(numbers.chunked(3) { it.sum() })
}

输出:

[[apple, banana, cherries], [dragon_fruit, egg_fruit, fig]]
[3, 12, 21, 30]

开窗的

windowed()函数可以获取给定大小的所有可能范围的项目集合。它返回一个元素范围列表,您将使用特定大小的滑动窗口在集合中看到这些范围。
它有两个可选参数:
step:每个窗口的第一项之间的距离。默认值为 1,因此结果包含从所有元素开始的窗口。
partialWindows:如果为 true,则包括最后剩下的较小尺寸的窗口。

Kotlin 程序演示 windowed()函数-

fun main(args: Array) {
    val fruits = listOf("apple", "banana", "cherries","orange")
    println(fruits.windowed(3))
    println(fruits.windowed(3, step = 2, partialWindows = true))
}

输出:

[[apple, banana, cherries], [banana, cherries, orange]]
[[apple, banana, cherries], [cherries, orange]]

有一个zipWithNext()函数来构建两个元素窗口,也可以通过转换调用。
Kotlin 程序演示 zipWithNext() –

fun main(args: Array) {
    val fruits = listOf("apple", "banana", "cherries",
        "dragon_fruit", "egg_fruit", "fig")
    println(fruits.zipWithNext())
}

输出:

[(apple, banana), (banana, cherries), (cherries, dragon_fruit), 
(dragon_fruit, egg_fruit), (egg_fruit, fig)]