Kotlin函数式编程 | 青训营

92 阅读2分钟

这是我参与「第四届青训营 」笔记创作活动的第12天

  • 定义:主要依赖于高阶函数(以函数为参数或返回类型)返回的数据,即利用高阶函数的特性,方便地实现将多个同类函数构建成链式调用以此来实现更加复杂的计算行为。

函数类别

  • 一个函数式应用通常由三大类函数构成:变换transform、过滤filter、合并combine。每类函数都针对集合数据类型设计,目标是产生一个最终结果。函数式编程用到的函数生来都是可组合的,也就是说,你可以组合多个简单函数来构建复杂的计算行为。

变换

  • 作用:遍历集合内容,并用一个以值参形式传入的变换器函数,变换原集合中的每一个元素,然后返回包含修改过后元素的集合给链式调用链上的其他函数调用,值得注意的是,原集合的内容不会改变

  • 细节:

    • map变换的过程中,返回的新集合的元素的类型可以与原数据类型保持一致,但集合的长度必须保持一致
    • 变换的过程中,传递变换的其实是原数据集合的副本
  • 实例:mapflatMap

    // map
    fun main() {
        var list = listOf("a","b","c","d")
        var res = list.map { "content: $it" }
        println(list)
        println(res)
    }
    // 运行结果:
    [a, b, c, d]
    [content: a, content: b, content: c, content: d]
    
    // flatMap
    fun main() {
        var list = listOf(listOf("a","b","c"), listOf(1,2,3)).flatMap { it }
        println(list)
    }
    // 运行结果:
    [a, b, c, 1, 2, 3]
    

    从上面的测试可以看出,变换后所得的集合不会改变/覆盖原集合,即在链式调用中,传递的是原数据的副本,其改变不会影响原数据

过滤

  • 作用:可以按照给定的条件过滤集合里的元素,如果给定的条件结果为true,则该元素被保留并添加进的结果集合中,如果给定的条件结果为false,则不将该元素放入新集合,与变换操作一样,过滤操作不会影响原数据集合

  • 关键字:filter

  • 实例:

    fun main() {
        var list = listOf(1,2,3,4,5,6,7,8)
        var res = list.filter { it % 2 == 0}
        println(list)
        println(res)
    }
    
    // 运行结果:
    [1, 2, 3, 4, 5, 6, 7, 8]
    [2, 4, 6, 8]
    

合并

  • 作用:将两个集合合并为一个包含键值对(Pair)的新集合

  • 关键字:zip

  • 实例:

    fun main() {
        var list1 = listOf(1,2,3,4)
        var list2 = listOf("a","b","c","d")
        println(list1.zip(list2))
    }
    
    // 运行结果:
    [(1, a), (2, b), (3, c), (4, d)]
    

    值得注意的是,如果两个集合的长度不一样,则新的集合的长度,是按长度较小的那个集合来算的,也就是,会自动舍弃多余的不能组成键值对的数据