Kotlin进阶系列-函数类型及函数字面值

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::plusprintln(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将从匿名函数自身返回。

郑重声明:本文内容及图片均整理自互联网,不代表本站立场,版权归原作者所有,如有侵权请联系管理员(admin#wlmqw.com)删除。
(0)
用户投稿
上一篇 2022年7月8日
下一篇 2022年7月8日

相关推荐

  • 吃了发的酱鸭拉肚子?李立群回应:造谣and诽谤

    【吃了发的酱鸭拉肚子?李立群回应:造谣and诽谤】 #吃了发的酱鸭拉肚子?李立群回应#针对有网络大V公开称李立群吃了社区发放的酱鸭闹肚子一事,李立群于4月23日夜发布视频声明,进行…

    2022年5月10日
  • 快看看你的星座是属于那种类型的

    白羊座 婴儿 头部 热情、冲动、自信 金牛座 幼儿 颈、喉咙 固执、耐心、慢郎中 双子座 儿童 手臂、手掌、肩、肺 多变、好奇心、花心 巨蟹座 少年 胸、胃、子宫、消化系统 温柔体…

    2022年8月19日
  • 格尔发13吨小牵引抢眼,新能源占比超8成,第360批牵引车新品概述

    本批次牵引车新品主要看点:7月市场环比涨势戛然而止,陕汽西康“龙骧”干线运输新品面世。NEV渗透率83.3%持续走高,江淮格尔发13吨“柴油小牵引”。FCV配套多元化:聚兴华通、国…

    2022年8月19日
  • 玩转OPPO系列:短信的进阶玩法,你都知道哪些?

    在QQ和微信还没有盛行的时代,短信基本上就是大家最主流的社交方式,还记得初中时代,半夜偷偷躲在被子里给心仪的对象发短信,即使一个月短信费几十上百也发的不亦乐乎。 如今新一代的社交A…

    2022年7月1日
  • 浓浓印度风!iPhone 14 Pro新增古铜配色

    iPhone 14系列预计今年9月发售,网上已经流传出许多与新机有关的信息。据国外网友爆料,iPhone 14 Pro或许会新增一款配色——古铜色,此消息一出,迅速登上了热搜。 从…

    2022年6月24日
  • iPhone 14全系价格或将上调,你还会买吗?

    近日,苹果将提高iPhone 14系列的售价上了热搜。媒体报道,由于原材料上涨,人力成本提高,苹果将提高iPhone 14系列的售价,同时会拉大同系列产品间的配置,引导用户购买。美…

    2022年6月25日
  • 麒麟芯片复活?鸿蒙系统又添新成员

    近日有博主爆料有为集团发布了一款名为Vikk K19 Pro的新机,但让人意外的是这是一款搭载麒麟985芯片的鸿蒙手机。 目前该消息还未得到准确的证实,不过之前有消息称该公司官方账…

    2022年7月23日
  • 拉夫劳伦PoloRalphLauren女装系列欣赏

    PoloRalphLauren炽热玫瑰盛放飞扬风情,点亮褶皱花缎裙摆,匹配全新PoloIDCollection 包袋,呈现别样色彩。 复古手绘渲染浪漫气息,迷人配饰增添随性因子,拉…

    2022年8月1日
  • iPhone 15或全系列搭载灵动岛,网友却更期待这项升级

    文 名动科技 今年发布的iPhone 14系列,最受欢迎的并不是标准版,而是Pro系列,相信大家也有所发现。 目前的市场反馈来看,也确实是这般情况,据网友给出了iPhone 14系…

    2022年9月20日
  • 颜值旗舰清仓退场,6400万三摄+12GB+256GB,顶配跌至2199元

    在以往的时候,各家手机都有属于自己的市场主打,比如有些厂商专注线下手机市场,有些厂商就专注线上手机市场,总体来说可以说是井水不犯河水。但是由于现在智能手机市场成为了红海市场,竞争也…

    2022年7月2日

联系我们

联系邮箱:admin#wlmqw.com
工作时间:周一至周五,10:30-18:30,节假日休息