Kotlin进阶系列-函数类型及函数字面值
liuian 2025-10-02 03:19 44 浏览
1. 函数类型
在Kotlin中,函数是一等公民(first class),这意味着函数可以被存储在变量或者数据结构中,它是有类型的。Kotlin使用函数类型来描述一个函数的具体类型。一个完整语法的函数类型如下:
(x:Int, y:Int) -> Int其特点如下:
- 函数类型包括三部分,箭头左侧的是函数的参数,描述了参数个数和类型,参数必须用小括号括起来;箭头处于中间;箭头右边是函数返回值的类型。比如上述函数类型的入参是两个Int型变量,返回值是Int型。注意如果返回值是Unit型时,不能省略不写。
- 函数参数的变量名可以省略不写,例如上述示例可以简写为:
(Int, Int) -> Int- 函数类型可以有一个额外的接收者类型,它的语法如下:
Int.(Int) -> Int接收者类型在参数前,和参数所在的小括号用点连接。关于带接收者的函数类型在之后会详细讲解。
2. 函数类型实例化
既然函数有类型,那函数类型变量的值是什么呢?这就涉及到函数类型的实例化。函数类型的实例化包括以下几种常用方式。
- 使用函数字面值进行赋值。函数字面值的具体含义下文会详细介绍。函数字面值包括两种,lambda表达式和匿名函数,其示例如下:
a. lambda表达式:
{ i, j-> this + i + j }b. 匿名函数:
fun(s1: Int, s2: Int): Int {
return 1
}- 使用一个已存在声明的可调用引用:
a. 顶级,本地,成员或者扩展函数。例如:String::toInt。
b. 顶级,成员,或者扩展属性:List::size。
c. 构造函数:::Regex。
- 使用实现了函数类型接口的自定义类的实例。例如:
class IntTransformer: (Int) -> Int {
override operator fun invoke(x: Int): Int = TODO()
}
val intFunction: (Int) -> Int = IntTransformer()函数类型的值可以通过invoke操作符调用,以下是示例。
val stringPlus: (String, String) -> String = String::plus
println(stringPlus.invoke("<-", "->"))
println(stringPlus("Hello, ", "world!"))3. 函数字面值
函数字面值是指不声明,而直接作为表达式传递的函数。它包括两种,lambda表达式及匿名函数。
3.1 lambda表达式
lambda表达式的全语法形式如下:
val sum: (Int, Int) -> Int = {x: Int, y: Int -> x + y}其特点如下:
- lambda表达式必须在大括号中。
- lambda表达式的参数列表在->左边,参数类型是可选的,如果其类型可以推断出来,则类型可以省略。例如上例可简写为:
val sum: (Int, Int) -> Int = {x, y -> x + y}- 如果lambda表达式的返回值不是Unit,其最后一个表达式的值是返回值。例如以下表达式:
val sum: (Int, Int) -> Int = {x, y ->
x + y
x-y
}其返回值是x-y
Kotlin有一个约定:如果函数的最后一个参数是函数,那么作为相应参数传入的lambda表达式可以放在圆括号之外。示例如下:
以lambda表达式作为参数的高阶函数如下:
fun lambdaWrapper(labmda: (Int) -> Int) {
labmda.invoke(1)
}其调用示例可以简写为:
fun lambdaTest() {
lambdaWrapper() { it ->
it+1
}
}如果lambda表达式是唯一的参数,那其圆括号可以省略,示例如下:
fun lambdaTest() {
lambdaWrapper{ it ->
it+1
}
}由于本lambda表达式只有一个参数,其可以隐式声明为it,并去掉该参数的声明和->。示例如下:
fun lambdaTest() {
lambdaWrapper{
it+1
}
}自Kotlin1.1起,如果lambda表达式的参数未使用,那么可以用下划线取代其名称:
map.forEach { _, value -> println("$value!") }3.2 匿名函数
lambda表达式不能显示的指定返回值的类型。如果需要显示指定返回值的类型,则需要使用匿名函数。匿名函数和普通函数非常类似,除了其函数名被省略。其示例如下:
fun(x: Int, y: Int): Int {
return x + y
}匿名函数的参数和返回值类型的声明与常规函数相同,同时类型如果可以推断出来则可以省略。例如以下示例:
fun anonymousWrapper(labmda: (Int) -> Int) {
labmda.invoke(1)
}
fun anonymousTest() {
anonymousWrapper(fun (i: Int): Int {
return i + 1
})
}anonymousTest中对匿名函数的调用是完整语法形态,由于参数类型和返回值类型可以推断,因此,其可以简写为
fun anonymousTest() {
anonymousWrapper(fun (i) = i+1)
}请注意,匿名函数参数总是在括号内传递。 允许将函数留在圆括号外的简写语法仅适用于lambda表达式。
lambda表达式与匿名函数之间的另一个区别是非局部返回的行为。一个不带标签的return语句总是在用fun关键字声明的函数中返回。这意味着lambda表达式中的return将从包含它的函数返回,而匿名函数中的return将从匿名函数自身返回。
相关推荐
- 搭建一个20人的办公网络(适用于20多人的小型办公网络环境)
-
楼主有5台机上网,则需要一个8口路由器,组网方法如下:设备:1、8口路由器一台,其中8口为LAN(局域网)端口,一个WAN(广域网)端口,价格100--400元2、网线N米,这个你自己会看了:)...
- 笔记本电脑各种参数介绍(笔记本电脑各项参数新手普及知识)
-
1、CPU:这个主要取决于频率和二级缓存,频率越高、二级缓存越大,速度越快,现在的CPU有三级缓存、四级缓存等,都影响相应速度。2、内存:内存的存取速度取决于接口、颗粒数量多少与储存大小,一般来说,内...
- 汉字上面带拼音输入法下载(字上面带拼音的输入法是哪个)
-
使用手机上的拼音输入法打成汉字的方法如下:1.打开手机上的拼音输入法,在输入框中输入汉字的拼音,例如“nihao”。2.根据输入法提示的候选词,选择正确的汉字。例如,如果输入“nihao”,输...
- xpsp3安装版系统下载(windowsxpsp3安装教程)
-
xpsp3纯净版在采用微软封装部署技术的基础上,结合作者的实际工作经验,融合了许多实用的功能。它通过一键分区、一键装系统、自动装驱动、一键设定分辨率,一键填IP,一键Ghost备份(恢复)等一系列...
- 没有备份的手机数据怎么恢复
-
手机没有备份恢复数据方法如下1、使用数据线将手机与电脑连接好,在“我的电脑”中可以看到手机的盘符。 2、将手机开启USB调试模式。在手机设置中找到开发者选项,然后点击“开启USB调试模式”。 3、...
- 电脑怎么激活windows11专业版
-
win11专业版激活方法有多种,以下提供两种常用的激活方式:方法一:使用激活密钥激活。在win11桌面上右键点击“此电脑”,选择“属性”选项。进入属性页面后,点击“更改产品密钥或升级windows”。...
- 华为手机助手下载官网(华为手机助手app下载专区)
-
华为手机助手策略调整,已不支持从应用市场下载手机助手,目前华为手机助手是需要在电脑上下载或更新手机助手到最新版本,https://consumer.huawei.com/cn/support/his...
- 光纤线断了怎么接(宽带光纤线断了怎么接)
-
宽带光纤线断了可以重接,具体操作方法如下:1、光纤连接的时候要根据束管内,同色相连,同芯相连,按顺序进行连接,由大到小。一般有三种连接方法,分别是熔接、活动连接和机械连接。2、连接的时候要开剥光缆,抛...
- win7旗舰版和专业版区别(win7旗舰版跟专业版)
-
1、功能区别:Win7旗舰版比专业版多了三个功能,分别是Bitlocker、BitlockerToGo和多语言界面; 2、用途区别:旗舰版的功能是所有版本中最全最强大的,占用的系统资源,...
- 万能连接钥匙(万能wifi连接钥匙下载)
-
1、首先打开wifi万能钥匙软件,若手机没有开启WLAN,就根据软件提示打开WLAN开关;2、打开WLAN开关后,会显示附近的WiFi,如果知道密码,可点击相应WiFi后点击‘输入密码’连接;3、若不...
- 雨林木风音乐叫什么(雨林木风是啥)
-
雨林木风的创始人是陈年鑫先生。陈年鑫先生于1999年创立了雨林木风公司,其初衷是为满足中国市场对高品质、高性能电脑的需求。在陈年鑫先生的领导下,雨林木风以技术创新、产品质量和客户服务为核心价值,不断推...
- aics6序列号永久序列号(aics6破解序列号)
-
关于AICS6这个版本,虽然是比较久远的版本,但是在功能上也是十分全面和强大的,作为一名平面设计师的话,AICS6的现有的功能已经能够应付几乎所有的设计工作了……到底AICC2019的功能是不是...
- 手机可以装电脑系统吗(手机可以装电脑系统吗怎么装)
-
答题公式1:手机可以通过数据线或无线连接的方式给电脑装系统。手机安装系统需要一定的技巧和软件支持,一般需要通过数据线或无线连接的方式与电脑连接,并下载相应的软件和系统文件进行安装。对于大部分手机用户来...
- 一周热门
- 最近发表
- 标签列表
-
- python判断字典是否为空 (50)
- crontab每周一执行 (48)
- aes和des区别 (43)
- bash脚本和shell脚本的区别 (35)
- canvas库 (33)
- dataframe筛选满足条件的行 (35)
- gitlab日志 (33)
- lua xpcall (36)
- blob转json (33)
- python判断是否在列表中 (34)
- python html转pdf (36)
- 安装指定版本npm (37)
- idea搜索jar包内容 (33)
- css鼠标悬停出现隐藏的文字 (34)
- linux nacos启动命令 (33)
- gitlab 日志 (36)
- adb pull (37)
- python判断元素在不在列表里 (34)
- python 字典删除元素 (34)
- vscode切换git分支 (35)
- python bytes转16进制 (35)
- grep前后几行 (34)
- hashmap转list (35)
- c++ 字符串查找 (35)
- mysql刷新权限 (34)
