kotlin函数式编程①(函数式编程简介|高阶函数|函数类别|transform变换函数|过滤函数|合并函数|map变换函数|flatmap变换函数)(代码片段)

韩曙亮 韩曙亮     2023-02-18     238

关键词:

文章目录





一、函数式编程简介



1、编程范式


编程范式 指的是 使用某种编程语言的 编程套路编程习惯 ;

使用 Java 等高级语言进行的编程 , 编程范式 一般都是 面向对象编程 ;

与 面向对象编程 同等级的另外一种 编程范式函数式编程 , 函数式编程 不依赖于 指定的语言 , 所有的编程语言都可以使用 函数式编程范式 ;


2、高阶函数


介绍 函数式编程 前先引入 高阶函数 的概念 , 高阶函数指的是 使用 函数类型 作为 参数 或 返回值 的函数 ;

也就是说 高阶函数参数 或 返回值Lambda 表达式 / 匿名函数 / 闭包 ( 三者是相同的概念 ) ;


3、函数式编程


函数式编程 主要依赖于 高阶函数 返回 的数据 , 调用 返回值 的其它函数 , 可以构建出 链式操作 , 处理复杂问题 ;

函数式编程 没有准确的 概念 , 目前使用了 链式调用 , 使用了大量的 Lambda 表达式作为 参数 或 返回值高阶函数 , 就是使用了 函数式编程 范式 ;


4、前端开发技术


移动端开发前端开发 使用的技术 趋于相同 , 在前端开发 ES6 ( JavaScript 标准 ECMAScript 6.0 ) 中 , 也使用 函数式编程 ;





二、函数类别



函数式编程 中 涉及到 三种 函数类别 :

  • 变换 Transform
  • 过滤 Filter
  • 合并 Combine

在 函数式编程 中 , 不同类型 的 函数 可以 组合起来 , 构建复杂的操作 ;


示例 : 上述 变换 , 过滤 , 合并 三种函数类型 , 一般都是 针对 集合 设计 的 , 如 Map 集合 , 进行上述操作后 , 最终得到一个结果 ;





三、变换函数



变换函数函数式编程 中的一种函数类型 ,

变换函数 的主要操作 是 遍历 集合中的元素 ,

变换函数 的 接收的参数 是 匿名函数 , 又称为 " 变换器函数 " , 该函数可以 对 集合中的 每个元素 进行变换操作 ,

变换完成后 , 再 将修改后的集合返回 , 然后以 供 函数式编程 调用链 中的后面的函数调用 ;

注意 : 上述操作 , 原来的集合是不改变的 ;


常见的 变换函数 :

  • map 函数 , 函数原型如下 , 该函数定义在 _Collections.kt 脚本中 ;
/**
 * Returns a list containing the results of applying the given [transform] function
 * to each element in the original collection.
 * 返回一个列表,其中包含将给定的[transform]函数应用于原始集合中的每个元素的结果。
 *
 * @sample samples.collections.Collections.Transformations.map
 */
public inline fun <T, R> Iterable<T>.map(transform: (T) -> R): List<R> 
    return mapTo(ArrayList<R>(collectionSizeOrDefault(10)), transform)

  • flatMap 函数 ; , 函数原型如下 , 该函数定义在 _Collections.kt 脚本中 ;
/**
 * Returns a single list of all elements yielded from results of [transform] function
 * being invoked on each element of original collection.
 * 返回在原始集合的每个元素上调用[transform]函数的结果所产生的所有元素的单一列表。
 */
public inline fun <T, R> Iterable<T>.flatMap(transform: (T) -> Iterable<R>): List<R> 
    return flatMapTo(ArrayList<R>(), transform)





四、map 变换函数




1、map 函数原型分析


分析 map 函数的原型 :

public inline fun <T, R> Iterable<T>.map(transform: (T) -> R): List<R>

map 函数 Iterable<T> 集合类型 扩展函数 , 该扩展函数 接收的参数 是 (T) -> R 类型 泛型扩展匿名函数 ,

transform: (T) -> R 泛型扩展匿名函数 接收 T 类型参数 , 返回 R 泛型类型的 参数 ,

最终返回的集合 是由 若干 R 泛型类型 实例对象组成的 List 集合 ;


2、map 函数设计理念


作用于 Iterable<T> 集合上的 map 变换函数 , 执行后 , 原始的 Iterable<T> 类型的集合没有进行修改 ,

返回的集合是 新的 List<R> 类型的集合 ;


map 函数 返回的 List<R> 类型的集合 的 元素个数 , 与 Iterable<T> 类型的输入集合 的元素个数 是相同的 ;

map 函数 返回的 List<R> 类型的集合 的 元素类型 , 与 Iterable<T> 类型的输入集合 的元素类型 可以是不同的 ;


函数式编程 的 设计理念 就是 原始数据保持不变 , 在函数调用链上传递的是数据副本 及 修改后的信息 ;


3、代码示例


代码示例 : 首先生成了一个 字符串集合 , 然后 调用 map 函数 , 传入一个 匿名函数 , 匿名函数的类型是 (T) -> R , 其接收一个泛型 T , 也就是 遍历的字符串对象 , 然后在匿名函数中 , 进行变换操作 ;

下面调用 map 变换函数时 , 还使用了 链式调用 , 在第一个变换后的集合的基础上 , 又进行了一次变换 ;

fun main() 
    val persons = listOf("Tom", "Jerry", "Jack")
    println("原集合 persons : $persons")

    val student = persons
        .map  person -> "$person is a student" 
        .map  student -> "$student, go to school"
    println("变换后的 persons 集合 : $persons")
    println("变换后的 student 集合 : $student")

执行结果 : 变换后 persons 集合 , 也就是 原集合没有发生新的变化 , 返回的集合是新创建的集合 ;

原集合 persons : [Tom, Jerry, Jack]
变换后的 persons 集合 : [Tom, Jerry, Jack]
变换后的 student 集合 : [Tom is a student, go to school, Jerry is a student, go to school, Jack is a student, go to school]





五、flatMap 变换函数




1、flatMap 函数原型分析


flatMap 函数 接收 (T) -> Iterable<R> 类型的 匿名函数 作为参数 , 返回 List<R> 类型的集合 ;

public inline fun <T, R> Iterable<T>.flatMap(transform: (T) -> Iterable<R>): List<R>

flatMap 函数 常用于 操作 集合 中的 集合 , 外层 集合每个元素 都是一个集合 , 称为 内层集合 , 将所有 内层集合 中的元素 都展开 , 放到一个 新的集合中 , 新的集合包含了 所有 内层集合 的元素 ;

外层集合的类型 Iterable<T> , 其中 T 就是内层集合的类型 , 内层集合的类型是 Iterable<R> 类型 , 内层集合的元素类型是 R 类型 , 最终返回的结果是 List<R> 类型的集合 ;

其本质就是合并集合 ;


2、代码示例


代码示例 : 外层集合中有两个元素 , 分别是 listOf(“Tom”, “Jerry”) 集合 和 listOf(“123”, “456”) 集合 , 对外层集合使用 flatMap 变换函数 , 则可以 将两个内层集合中的元素合并起来放到一个新的集合中 ;

原来的外层集合以及内层集合不变 , 返回的 total 集合是一个新的集合 ;

此外在 flatMap 函数中可以传入 (T) -> Iterable<R> 类型的 匿名函数 作为参数 , 对内层集合进行处理 ;

fun main() 
    val total = listOf(
        listOf("Tom", "Jerry"),
        listOf("123", "456"))
        .flatMap  it 

    println(total)

执行结果 :

[Tom, Jerry, 123, 456]

kotlin函数式编程思想fpinkotlin

Kotlin函数式编程思想:FPinKotlin函数式编程特性闭包和高阶函数函数编程支持函数作为第一类对象,有时称为闭包或者仿函数(functor)对象。实质上,闭包是起函数的作用并可以像对象一样操作的对象。与此类似,FP语言... 查看详情

kotlin初学者函数式编程(代码片段)

...#xff1a;CSDN博客专家、华为云·云享专家认证系列专栏:Kotlin初学者五星好评:左侧点一下(网页端),移动端:https://bbs.csdn.net/topics/603956616目录一、函数式编程概念1.1面向函数编程(FOP)1.2高阶函数1.3为什么... 查看详情

kotlin初学者函数式编程(代码片段)

...#xff1a;CSDN博客专家、华为云·云享专家认证系列专栏:Kotlin初学者五星好评:左侧点一下(网页端),移动端:https://bbs.csdn.net/topics/603956616目录一、函数式编程概念1.1面向函数编程(FOP)1.2高阶函数1.3为什么... 查看详情

kotlin初学者函数式编程(代码片段)

...#xff1a;CSDN博客专家、华为云·云享专家认证系列专栏:Kotlin初学者五星好评:左侧点一下(网页端),移动端:https://bbs.csdn.net/topics/603956616目录一、函数式编程概念1.1面向函数编程(FOP)1.2高阶函数1.3为什么... 查看详情

kotlin中函数式编程的详解(代码片段)

...联合多个同类函数构建链式操作以创建复杂的计算行为。Kotlin支持多种编程范式,所以你可以用混用面向对象编程和函数式编程范式来解决手头问题。二、函数式编程类别一个函数式应用通常由三大函数构成:变换transfor... 查看详情

函数式编程和高阶函数

函数式编程函数式编程就是一种抽象程度很高的编程范式,纯粹的函数式编程语言编写的函数没有变量,因此,任意一个函数,只要输入是确定的,输出就是确定的,这种纯函数我们称之为没有副作用。而允许使用变量的程序设... 查看详情

函数式编程—高阶函数(代码片段)

一、函数式编程概念简介函数是Python内建支持的一种封装,我们通过把大段代码拆成函数,通过一层一层的函数调用,就可以把复杂任务分解成简单的任务,这种分解可以称之为面向过程的程序设计。函数就是面向过程的程序设... 查看详情

函数式编程

python下的函数式编程  函数式编程允许有变量;支持高阶函数(函数可以作为变量传入);支持闭包(可以返回函数);有限度地支持匿名函数高阶函数1.定义:能够接收函数作为参数的函数就是高阶函数,下面举个例子... 查看详情

11.高阶函数(匿名/*递归/函数式)对象编程基础

高阶函数匿名函数匿名函数存在的情况:内置函数函数式编程递归函数式编程面向对象的程序设计类:实例:OOP类的名称空间/对象的名称空间高阶函数匿名函数lambdax:x+y#returnx+y定义标志/参数(形式类似函数传参)/跟表达式(返... 查看详情

js函数式编程基础:高阶函数柯理化函数合成loadash

一、函数式编程什么是函数式编程(FP)?FP是一种编程范式,也是一种编程风格,和面向对象是并列的关系。FP用于描述数据或函数之间的映射;根据输入通过某种运算获得相应的输出,即映射关系,例如:y=sin(x)。FP需要有输入和... 查看详情

python函数式编程以及高阶函数(代码片段)

文章目录一、什么是函数式编程二、高阶函数的概念1.map和reduce函数2.filter函数3.sorted函数此文章参考廖雪峰大神的官网,地址:函数式编程-廖雪峰的官方网站(liaoxuefeng.com)一、什么是函数式编程首先要知道的是,函数... 查看详情

kotlin小知识之高阶函数(代码片段)

文章目录高阶函数定义高阶函数函数类型高阶函数示例内联函数内联函数的作用内联函数的用法noinline与crossinline高阶函数定义高阶函数高阶函数和Lambda的关系是密不可分的.像接受Lambda参数的函数就可以称为具有函数式编程风格... 查看详情

函数式编程基础---高阶函数和偏函数

一、高阶函数  所谓高阶函数是指可一把函数作为参数,或者是可以将函数作为返回值的函数(我们见得闭包函数就是高阶函数)。functionfoo(x){returnfunction(){returnx;}}  对于程序的编写,高阶函数比普通函数要灵活的多,除了... 查看详情

day-6:函数式编程

  函数式编程就是封装成一个个函数,一次调用来完成复杂任务。  函数式编程的一个特点是,允许把函数本身作为参数传入另一个函数,还允许返回一个函数!高阶函数  高阶函数就是将函数的变量名作为参数传入,内... 查看详情

前端学习之函数式编程—高阶函数(代码片段)

 什么是高阶函数(Higher-orderfunction)    可以把函数作为参数传递给另一个函数    可以把函数作为另一个函数的返回结果Part1可以把函数作为参数传递给另一个函数实现forEach函数//高阶函数-函数作为参数functionforEach(array,fn)for(... 查看详情

函数式编程--高阶函数--sorted

定义sorted函数可以list进行排序#sorted可以对list进行排序L=[3,7,-11,10,6]print(sorted(L))sorted()函数也是一个高阶函数,它还可以接收一个key函数来实现自定义的排序,key指定的函数将作用于list的每一个元素上,并根据key函数返回的结果... 查看详情

你真的理解函数式编程吗?

你真的理解函数式编程吗? 大数据以及人工智能越来越流程,你是否可以轻松适应大数据编程,函数式编程在其中起着重要作用,如何从面向对象编程跳槽到函数式编程?你是否觉得函数式各种概念难于理解?本场Chat将为... 查看详情

函数式编程的类型转换

1、基础类型转换为高阶类型(monad),以便使用函数式编程的特性:map、reduce,pipeline、业务组织、异步编程等;2、高阶类型转化为基础类型:以便使用基础类型的态射(计算)功能。3、高阶类型的内部转换(泛型类型转换)--... 查看详情