Kotlin(十五) 高阶函数详解

news2024/11/27 4:17:11

高阶函数的定义

高阶函数和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=name
    student.age=age
    return 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=name
        student.age=age
        student
    }
    println("name=${student2.name}------age=${student2.age}")

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

从零开始搭建链上dex自动化价差套利程序(13)

优化 优化触发条件: 之前的触发条件有问题,导致迟迟不能触发,优化后触发条件如下: dydx_take 0.0002apex_make 0.0005​float(b_first_price_apex)-float(s_first_price_dydx) > float(b_first_price_apex)*apex_makefloat…

unity中:搭建在线AR应用

使用Imagine WebAR - Image Tracker插件部署WebGL应用 在使用Imagine WebAR - Image Tracker插件进行WebGL应用开发时,有两个关键知识点需要掌握: 1. 部署到支持HTTPS的服务器 由于WebGL应用需要访问用户的摄像头,因此必须在支持HTTPS的服…

docker---资源控制

docker的资源控制 对容器使用宿主机的资源进行限制。 三种控制方向:CPU 内存 磁盘I/O docker使用linux自带的功能cgroup;control groups是linux内核系统提供的一种可以限制记录,隔离进程所使用的物理资源机制。 docker借助此…

腾讯云CentOS8 jenkins war安装jenkins步骤文档

腾讯云CentOS8 jenkins war安装jenkins步骤文档 一、安装jdk 1.1 上传jdk-11.0.20_linux-x64_bin.tar.gz 1.2 解压jdk安装包文件 tar -zxvf jdk*.tar.gz 1.3 在/usr/local 目录下创建java目录 cd /usr/local mkdir java 1.4 切到java目录,把jdk解压文件改名为jd…

P2 Qt Creator创建第一个Qt程序

前言 🎬 个人主页:ChenPi 🐻推荐专栏1: 《C_ChenPi的博客-CSDN博客》✨✨✨ 🔥 推荐专栏2: 《LLinux C应用编程(概念类)_ChenPi的博客-CSDN博客》✨✨✨ 🌺本篇简介 :这一章我们学…

屏幕分辨率修改工具SwitchResX mac功能特点

SwitchResX mac是可用于修改和管理显示器的分辨率和刷新率。 SwitchResX mac功能和特点 支持多种分辨率和刷新率:SwitchResX可以添加和管理多种分辨率和刷新率,包括自定义分辨率和刷新率。 自动切换分辨率:SwitchResX可以根据应用程序和窗口…

【带头学C++】----- 九、类和对象 ---- 9.10 C++设计模式之单例模式设计

❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️麻烦您点个关注,不迷路❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️ 目 录 9.10 C设计模式之单例模式设计 举例说明: 9.10 C设计模式之单例模式设计 看过我之前的文章的,简单讲解过C/Q…

炫酷不止一面:探索JavaScript动画的奇妙世界(下)

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云…

C#云LIS系统源码 B/S架构,SaaS模式,可扩展性强

基于B/S架构的云LIS检验系统源码,整个系统的运行基于WEB层面,只需要在对应的工作台安装一个浏览器软件有外网即可访问。全套系统采用云部署模式,部署一套可支持多家医院检验科共同使用。 采用.Net Core新的技术框架、DEV报表、前端js封装、分…

3D材质编辑:制作被火烧的木头

在线工具推荐: 3D数字孪生场景编辑器 - GLTF/GLB材质纹理编辑器 - 3D模型在线转换 - Three.js AI自动纹理开发包 - YOLO 虚幻合成数据生成器 - 三维模型预览图生成器 - 3D模型语义搜索引擎 当谈到游戏角色的3D模型风格时,有几种不同的风格&#xf…

AI材料专题报告:AI革命催生新需求国产替代推动新方向

今天分享的AI系列深度研究报告:《AI材料专题报告:AI革命催生新需求国产替代推动新方向》。 (报告出品方:光大证券) 报告共计:25页 1、算力需求增长催生 800G 光模块需求 算力是数字经济时代新生产力&…

基于深度学习yolov5钢材瑕疵目标检测系统

欢迎大家点赞、收藏、关注、评论啦 ,由于篇幅有限,只展示了部分核心代码。 文章目录 一项目简介简介YOLOv5钢材瑕疵目标检测系统特性1. 数据预处理2. 模型架构3. 训练策略4. 后处理 性能评估 二、功能三、系统四. 总结 一项目简介 # YOLOv5 钢材瑕疵目标…

Navicat 技术指引 | 适用于 GaussDB 分布式的查询功能

Navicat Premium(16.3.3 Windows 版或以上)正式支持 GaussDB 分布式数据库。GaussDB 分布式模式更适合对系统可用性和数据处理能力要求较高的场景。Navicat 工具不仅提供可视化数据查看和编辑功能,还提供强大的高阶功能(如模型、结…

优化算法 学习记录

文章目录 相关资料 优化算法梯度下降学习率牛顿法 随机梯度下降小批量随机梯度下降动量法动量法解决上述问题 AdaGrad 算法RMSProp算法Adam学习率调度器余弦学习率调度预热 相关资料 李沐 动手学深度学习 优化算法 优化算法使我们能够继续更新模型参数,并使损失函…

flutter TextPainter 的用法

本文章基于 Flutter 3.16.2 Dart SDK 3.2.2。 TextPainter 是 Flutter 中用于在 Canvas 上绘制文本的类。它允许您在自定义的 CustomPainter 中使用 drawText 方法来绘制文本,并可以控制文本的位置、颜色、字体等属性。 import package:flutter/material.dart;cla…

如何使用 Wordpress?托管, 网站, 插件, 缓存

这是该系列教程的第一个教程,最终将在运行高性能 LEMP 堆栈的阿里云 ECS 实例上运行一个新的 WordPress 站点。 在本教程中,我们将创建一个运行 Ubuntu 16.04 的实例,然后通过创建超级用户并禁用 root 登录来保护服务器,最后配置…

MN316 OpenCPU丨HTTP使用介绍

HTTP(Hyper Text Transfer Protocol)即超文本传输协议,是一个简单的请求-响应协议,通常运行在TCP之上,它指定了客户端可能发送给服务器消息类型以及得到什么类型响应。HTTPS(Hyper Text Transfer Protoc…

Fiddler抓包模拟器(雷电模拟器)

Fiddler设置 List item 打开fiddler,的options 点击OK,重启fiddler 模拟器 更改网络设置 IP可以在电脑上终端上查看 然后在模拟器浏览器中输入IP:端口 安装证书

JVM常见垃圾回收器

串行垃圾回收器 Serial和Serial Old串行垃圾回收器,是指使用单线程进行垃圾回收,堆内存较小,适合个人电脑 Serial作用于新生代,采用复制算法 Serial Old作用于老年代,采用标记-整理算法 垃圾回收时,只有…

django与数据库交互关于当前时间的坑

背景 在线上服务中使用时间进行数据库操作时发现异常,而在本地环境无法成功复现此问题,导致难以进行故障排查。 核心问题 view.py class XxxViewSet(viewsets.ModelViewSet):queryset Xxx.objects.with_status().order_by("status", &quo…