【Kotlin】函数 ⑧ ( 函数引用 作为函数参数 | ::函数名 | 函数类型 作为函数返回值类型 )

news2024/12/27 2:00:45

文章目录

  • 一、函数引用作为函数参数
  • 二、函数类型作为函数返回值





一、函数引用作为函数参数



函数 作为参数 , 有两种方式 :

  • 传递 Lambda 表达式 , 也就是 匿名函数 作为参数值 ;
  • 传递 函数引用 作为参数值 ;

函数引用 可以将 具名函数 转为 函数的参数值 , 只要可以使用 Lambda 表达式 参数的地方 , 就可以使用 函数引用 进行替代 ;

函数引用格式 : 两个冒号 加上 函数名 , 就是函数引用 ;

::函数名

如下 doSomething 函数的 函数引用 是 ::doSomething ;

fun doSomething(name: String, age: Int): String {
    return "student $name $age years old, say hello"
}

具名函数 与 匿名函数 相对 , 具名函数 是有 函数名的函数 , 匿名函数 没有函数名 ;


代码示例 : 在下面的代码中 ,

首先使用 actionFun 函数类型变量 作为 studentDoSomething 函数的参数 , 该变量的值是一个 匿名函数 Lambda 表达式 ,

然后使用 doSomething 函数的 函数引用 ::doSomething 作为 studentDoSomething 函数的参数 ,

使用 匿名函数 Lambda 表达式 作为参数 与 使用 函数引用 作为参数 , 其效果是相同的 ;

fun main() {
    // 定义函数类型变量, 之后作为函数参数传递给函数
    // 该匿名函数变量, 可以作为参数
    val actionFun = { name: String, age: Int ->
        "student $name $age years old, say hello"
    }

    // 调用 studentDoSomething 函数, 输入姓名, 年龄, 执行的操作
    // 使用匿名函数 Lambda 表达式作为参数
    studentDoSomething("Tom", 18, actionFun);

    // 使用函数引用作为参数
    studentDoSomething("Jerry", 17, ::doSomething);
}

fun studentDoSomething(name: String, age: Int,
                       action: (String, Int) -> String) {
    val act = action(name, age);
    println(act)
}

fun doSomething(name: String, age: Int): String {
    return "student $name $age years old, say hello"
}

执行结果 :

student Tom 18 years old, say hello
student Jerry 17 years old, say hello

在这里插入图片描述





二、函数类型作为函数返回值



函数 的 返回值类型 , 也可以是 函数类型 ;

也就是说 匿名函数 , Lambda 表达式 可以作为 函数的返回值 ;


代码示例 : 下面的代码中 ,

returnFun 函数的返回值 是一个函数类型 (String)->String , 返回的是一个 匿名函数 Lambda 表达式 ;

使用 var fun0 变量 接收 上述函数 返回的 Lambda 表达式 , 并执行该 匿名函数 ;

fun main() {
    // 接收函数类型的返回值
    var fun0 = returnFun();

    // 执行 返回的 函数
    var str = fun0("Tom")
    println(str)
}

// 函数的返回值 是函数类型
fun returnFun(): (String)->String {
    return { name: String ->
        "Hello $name"
    }
}

执行结果 :

Hello Tom

在这里插入图片描述

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

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

相关文章

程序员真是越来越懒了,Api 文档都懒得写?程序员:Api工具惯的!

关于大多数程序员不爱写文档问题, 我觉得可以从两个方面去拆解:主观原因、客观原因。 1. 客观 - 时间紧任务重,需求变化快 需求方每次都是紧急需求,老板每次都要求敏捷开发,快速响应。 按时交付的压力已经让大多数程…

区分: 小程序组件 and 小程序插件

近期发现有不少小伙伴分不清小程序组件和小程序插件,以为它们是一回事,只是措辞不一样。但实际上,小程序组件和小程序插件完全是两回事——插件是可以直接提供服务的,组件是给开发者提供的轮子,不能直接提供服务。下面…

Java--基本数据类型

文章目录前言一、数据类型-byte二、数据类型-short三、数据类型-int四、数据类型-long五、数据类型-float六、数据类型-double七、数据类型-char八、数据类型-boolean九、数据类型实例前言 Java提供了八种基本类型,六种数字类型(四个整数型,…

LoRa无线远传水表方案ASR6500S/LLCC68

LoRa无线远传水表就是普通机械水表加上电子采集发讯模块而组成,电子模块完成信号采集、数据处理、存储并将数据通过通信线路上传给中继器、或手持式的抄表器。LoRa无线远传水表作为市面上比较火的智能水表;由主站通过传输媒体将多个户用仪表的数据集中抄…

MyBatis讲解,批量删除1

一、批量删除1 入参字符串 ”id1,id2,id3” 批量删除的关键字是 in 1.书写BookMapper 1.1先在navicat的新建查询里书写批量删除的sql语句 批量删除的sql语句 delete from book where id in (12,22); 1.2将sql语句复制到BookMapper里 2.书写BookDao批量删除方法 *书写dao…

【安全硬件】Chap.4 如何插入一个硬件木马到芯片的时序逻辑电路的漏洞里?如何构建可信赖的状态机?

【安全硬件】Chap.4 如何插入一个硬件木马到芯片的时序逻辑电路的漏洞里?如何构建可信赖的状态机?前言:硬件木马1. 时序逻辑电路中的设计漏洞Design Vulnerabilities序列检测器的设计漏洞——以智能门锁的虚位密码漏洞为例易受攻击的状态机写…

Qt基础之十八:WebEngine与JavaScript交互

Qt从5.6开始就用Qt Webengine替换了Qt WebKit,据说加载速度较Qt WebKit更快。 需在pro中添加QT += webenginewidgets 一.效果 二.实现 1.JavaScript调用Qt函数 在MainWindow中定义成员变量QWebChannel *m_channel;作为和web通信的数据通道 ①加载网页 void MainWindow::l…

多线程案例-阻塞式队列

1.什么是阻塞队列阻塞队列是一种特殊的队列,在"先进先出"的原则下又引入了"阻塞"功能阻塞队列能是一种线程安全的数据结构,具有以下特性:当队列满的时候,继续入队列就会阻塞,直到其它线程从队列中取走元素当队列空的时候,继续出队列就会阻塞,直到其它队列向…

内蒙古大学计算机考研893计算机考研真题分享

内蒙古大学计算机学院成立于1997年,软件学院成立于2005年,与计算机学院为一个实体,两个牌子。 目前,学院由计算机科学系、软件工程系、信息管理系和计算中心(实验中心)组成,设有计算机科学与技…

uniapp开发小程序引入微信快递跟踪(快递100)插件

目录 1.小程序插件接入 2.代码示例 3.页面接收参数 4.常用快递100公司编码表 1.小程序插件接入 微信快递100插件地址:快递100-快递查询(免费接入) | 微信服务市场 (qq.com) 1)进入链接地址 2)登陆开发小程序的账…

二叉树18:从中序与后序遍历序列构造二叉树

主要是我自己刷题的一些记录过程。如果有错可以指出哦,大家一起进步。 转载代码随想录 原文链接: 代码随想录 leetcode链接:344. 反转字符串 题目: 给定两个整数数组 inorder 和 postorder ,其中 inorder 是二叉树的…

最全Go select底层原理,一文学透高频用法

导语 |在日常开发中,select语句被高频使用。但目前,全网分析select在编译期和运行时的完整底层原理资料,非常匮乏。本文基于Go1.18.1版本的源码,讲解select访问Channel在编译期和运行时的底层原理——select编译器优化用到的src/c…

2022年第十二届APMCM亚太杯1月增赛E题发布

2022年亚洲及太平洋地区建模数学竞赛问题E 有多少颗核弹可以摧毁地球? 1945年8月6日,第二次世界大战接近尾声。为了尽快结束战争,美国在日本广岛投下了名为"小男孩"的下一颗原子弹。这样一颗原子弹炸死了广岛的200000人,广岛的所有…

【数据结构Java版】对象的比较之Comparable与Comparator比较器

目录 一、基本类型的比较 二、对象类型的比较 (1)对象类型比较出现的问题 (2)重写基类equals方法 (3)基于Comparable接口的比较 1.实现Comparable接口,重写compareTo方法 (4&a…

Flask框架中常规漏洞防范方法

一、前言 Double Fetch是一种条件竞争类型的漏洞,其主要形成的原因是由于用户态与内核态之间的数据在进行交互时存在时间差,我们在先前的学习中有了解到内核在从用户态中获取数据时会使用函数copy_from_user,而如果要拷贝的数据过于复杂的话…

leetcode | 链表

01 链表知识点 1.1 基础知识 线性表:零个或多个相同类型的数据元素的有限序列,一对一关系,所含数据元素个数n称为线性表的长度。 线性表有两种物理结构(存储结构):顺序存储、链式存储。 线性表的顺序存储结构:用一段…

优化改进YOLOv5算法之添加SE、CBAM、CA模块(超详细)

目录 1 SENet 1.1 SENet原理 1.2 SENet代码(Pytorch) 1.3 YOLOv5中加入SE模块 1.3.1 common.py配置 1.3.2 yolo.py配置 1.3.3 创建添加RepVGG模块的YOLOv5的yaml配置文件 2 CBAM 2.1 CBAM原理 2.2 CBAM代码(Pytorch) 2.3 YOLOv5中加入CBAM模块 2.3.1 common.py配…

敏捷是一种态度:有了敏捷建模,就有了敏捷需求

目 录01 缘起02 敏捷需求5W1H的思考‍‍‍‍‍‍03 关于敏捷需求体系的一些思考‍‍‍‍‍‍04 写在敏捷需求后的话01缘起对研发效能提升的研究,是近年来各家企业技术部门一直在研究的课题。早期,针对敏捷开发的实践,让大多技术管理者尝到…

114.(leaflet之家)leaflet空间判断-点与圆的空间关系

听老人家说:多看美女会长寿 地图之家总目录(订阅之前建议先查看该博客) 文章末尾处提供保证可运行完整代码包,运行如有问题,可“私信”博主。 效果如下所示: 下面献上完整代码,代码重要位置会做相应解释 <!DOCTYPE html> <html>

每个开发人员都应该使用的可扩展和可维护的 React 项目结构

一个好的项目结构可以在理解代码库、灵活性和维护方面对项目的成功产生巨大影响。结构和维护不当的项目很快就会变成一团糟和可怕的遗产&#xff0c;没有人愿意与之共事。我现在将向您展示我在项目中经常使用的结构&#xff0c;并解释其背后的原因。这种结构应该是大规模应用程…