Kotlin(十五) 高阶函数详解

高阶函数的定义

高阶函数和Lambda的关系是密不可分的。在之前的文章中,我们熟悉了Lambda编程的基础知识,并且掌握了一些与集合相关的函数式API的用法,如mapfilter函数等。另外,我们也了解了Kotlin的标准函数,如runapply函数等。

这些函数有一个共同的特点:它们都会要求传入一个Lambda表达式作为参数。像这种接收Lambda参数的函数就可以称为具有函数式编程风格的API,而如果你想要定义自己的函数式API,那就得借助高阶函数来实现了。

所以高阶函数的定义:如果一个函数接收另一个函数作为参数,或者返回值的类型是另一个函数,那么该函数就称为高阶函数。

这个定义可能有点不太好理解,一个函数怎么能接收另一个函数作为参数呢?这就涉及另外一个概念了:函数类型。我们知道,编程语言中有整型、布尔型等字段类型,而Kotlin又增加了一个函数类型的概念。如果我们将这种函数类型添加到一个函数的参数声明或者返回值声明当中,那么这就是一个高阶函数了。

定义一个函数类型

不同于定义一个普通的字段类型,函数类型的语法规则是有点特殊的,基本规则如下:

(String, Int) -> Unit

既然是定义一个函数类型,那么最关键的就是要声明该函数接收什么参数,以及它的返回值是什么。因此,->左边的部分就是用来声明该函数接收什么参数的,多个参数之间使用逗号隔开,如果不接收任何参数,写一对空括号就可以了。而->右边的部分用于声明该函数的返回值是什么类型,如果没有返回值就使用Unit,它大致相当于Java中的void

现在将上述函数类型添加到某个函数的参数声明或者返回值声明上,那么这个函数就是一个高阶函数了,如下所示:

fun example(funExample: (String, Int) -> Unit) {funExample("你好", 111)
}

如果是有返回值的,代码示例:

fun example(name: String, age: Int, getStudent: (String, Int) -> Student): Student {return getStudent(name, age)
}

这里我们定义了一个getStudent的函数用来返回Student对象,那么我们就可以定义一个方法,代码如下:

fun gStudent(name:String,age: Int):Student{val student=Student("001",1)student.name=namestudent.age=agereturn student
}

然后调用:

    val student= example("我的",12,::gStudent)println("name=${student.name}------age=${student.age}")

打印结果:

你会发现,当我们需要返回值时,我们需要定义个方法来让高阶函数调用,这样是不是太麻烦了,Kotlin也考虑到了这一点,我们可以通过Lambda表达式、匿名函数、成员引用等。其中,Lambda表达式是最常见也是最普遍的高阶函数调用方式。

我们仍以上面的高阶函数为例,改成Lambda表达式,示例如下:

val student2 = example("张三", 12,) { name,age ->val  student =Student("",2)student.name=namestudent.age=agestudent}println("name=${student2.name}------age=${student2.age}")

这样我们就不需要单独再去定义个函数来调用,我们可以直接在Lambda表达式中对参数进行操作,从而得到我们想要的数据

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/266180.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Footprint Analytics x Future3 万字研报:AI 与 Web3 数据行业融合的现状、竞争格局与未来机遇探析(上)

GPT的横空出世将全球的目光吸引至大语言模型,各行各业都尝试着利用这个“黑科技”提高工作效率,加速行业发展。Future3 Campus携手Footprint Analytics共同深入研究AI与Web3结合的无限可能,联合发布了《AI与Web3数据行业融合现状、竞争格局与…

springboot集成knife4j详细教程

使用原生的swagger作为接口文档,功能不够强大,并且默认的ui比较简陋,不符合大众审美。所以实际开发中推荐使用knife4j对swagger进行增强。knife4j的地址:https://gitee.com/xiaoym/knife4j 基本使用 想要使用knife4j非常简单&…

1. mycat入门

1、mycat介绍 Mycat 是一个开源的分布式数据库系统,但是由于真正的数据库需要存储引擎,而 Mycat 并没有存 储引擎,所以并不是完全意义的分布式数据库系统。MyCat是目前最流行的基于Java语言编写的数据库中间件,也可以理解为是数据…

redis报错

Caused by: io.netty.channel.AbstractChannelSAnnotatedConnectException:

Java LeetCode篇-二叉树经典解法(实现:判断平衡二叉树、找两个节点最近的祖先等)

🔥博客主页: 【小扳_-CSDN博客】 ❤感谢大家点赞👍收藏⭐评论✍ 文章目录 1.0 平衡二叉树 1.1 实现判断平衡二叉树的思路 1.2 代码实现判断平衡二叉树 2.0 二叉树的层序遍历 2.1 实现二叉树层序遍历的思路 2.2 代码实现二叉树层序遍历 3.0 …

Proteus仿真--射击小游戏仿真设计

本文介绍基于proteus射击小游戏仿真设计(完整仿真源文件及代码见文末链接) 仿真图如下 K1-K4为4个按键,用于上移、下移、确认等,模拟单机游戏 仿真运行视频 Proteus仿真--射击小游戏仿真设计 附完整Proteus仿真资料代码资料 …

自动化测试之读取配置文件

前言: 在日常自动化测试开发工作中,经常要使用配置文件,进行环境配置,或进行数据驱动等。我们常常把这些文件放置在 resources 目录下,然后通过 getResource、ClassLoader.getResource 和 getResourceAsStream() 等方法…

红队攻防实战之Redis-RCE集锦

心若有所向往,何惧道阻且长 Redis写入SSH公钥实现RCE 之前进行端口扫描时发现该机器开着6379,尝试Redis弱口令或未授权访问 尝试进行连接Redis,连接成功,存在未授权访问 尝试写入SSH公钥 设置redis的备份路径 设置保存文件名 …

18.Java程序设计-基于Springboot的电影院售票系统的设计与实现

摘要 电影产业在当今社会中占据着重要地位,电影院作为观影的主要场所,其售票系统的高效性和用户体验至关重要。本文基于Spring Boot框架设计并实现了一款电影院售票系统,旨在提高售票效率、优化用户体验,并解决传统售票方式存在的…

【EMNLP 2023】面向Stable Diffusion的自动Prompt工程算法

近日,阿里云人工智能平台PAI与华南理工大学朱金辉教授团队合作在自然语言处理顶级会议EMNLP2023上发表了BeautifulPrompt的深度生成模型,可以从简单的图片描述中生成高质量的提示词,从而使文生图模型能够生成更美观的图像。BeautifulPrompt通…

【基础篇】一,认识STM32

一,什么是STM32? STM32是一款由意法半导体公司开发的32位微控制器;其中ST指意法半导体;M指MCU或MPU,32指32 位。 STM32覆盖了Cortex-M的多种系列,包括M0、M0、M3、M7等。在分类上,STM32有很多…

硅片制作工艺-详细图文版

首先将多晶硅和掺杂剂放入单晶炉内的石英坩埚中,将温度升高至1000多度,得到熔融状态的多晶硅。 硅锭生长是一个将多晶硅制成单晶硅的工序,将多晶硅加热成液体后,精密控制热环境,成长为高品质的单晶。 相关概念&#xf…