1.函数的声明

kotlin中函数的声明和java中有所不同。

1)得有fun关键字修饰,

2)参数的声明方式和变量声明类似 age:Int,先写参数名,后面跟着参数类型

3)返回值类型写在参数的后面。

//可见性修饰符  函数关键字 方法法名     参数名 参数类型          返回值
private       fun      functionName(age: Int, name: String): String {return name + age;
}

2.函数参数

默认值参:如果不打算传入值参,可以预先给参数设定默认值

fun main() {//通常调用方式fix("xiaohua", 20)//age已经给定默认值,此时可以不传参数fix("xiaohua")
}//参数age 给定默认值
fun fix(name: String, age: Int = 18) {println(name + age)
}

3.Unit函数

Kotlin中没有返回值的函数叫Unit函数,也就是说他们的返回值是Unit

可以打印一下上面定义的fix函数。打印的值是kotlin.Unit。

  println( fix("xiaohua"))

4.匿名函数:定义时不取名字的函数,被称为匿名函数。

1)具名函数的声明:会显示的使用fun关键字修饰。

//具名函数
fun sayHello(): String {return "Hello world!"
}fun main() {//具名函数调用println(sayHello())
}

匿名函数:

1)匿名函数虽然没有名字,但是可以赋值给变量,这个变量的类型就是函数类型。就像其他变量赋值那样。

2) 和具名函数不一样,匿名函数通常不需要return关键字返回数据。匿名函数会隐式的或自动返回最后一行代码的执行结果。

普通变量赋值:

 val hello: String = "hello"

匿名函数赋值变量:

fun main() {//声明一个匿名函数,并赋值给变量sayHelloval sayHello: () -> String = {"Hello world!"}//匿名函数调用println(sayHello())
}

3)匿名函数类型。

普通变量的类型在赋值时就指定了,或者通过类型推断,由编译器在编译器指定变量类型。

那么匿名函数的类型是啥,由啥决定?

匿名函数的类型是由参数和返回值决定的。

fun main() {//声明一个匿名函数,并赋值给变量sayHelloval sayHello: () -> String = {"Hello world!"}//打印函数变量println(sayHello)
}

得到的结果是Function0<java.lang.String>

Function0:Function后的数字表示的是参数的个数,0表示无参,1表示一个参数,以此类推。

<java.lang.String> 表示的是匿名函数返回值类型。

5.匿名函数的参数:

匿名函数可以不带参数,也可以带一个参数或多个参数。

需要带参数时,参数类型放在匿名函数的类型定义中“()”,参数名放在函数定义中“{}”。

1)一个参数的定义:

fun main() {val sayHello: (name: String) -> String = { name ->"Hello $name!"}println(sayHello("HanMei"))
}

当匿名函数的参数只有一个时,可以使用it关键字来表示参数名。当有多个参数时就不能使用了。

fun main() {val sayHello: (name: String) -> String = {"Hello $it!"}println(sayHello("HanMei"))
}

2)定义多个参数的匿名函数

fun main() {val sayHello: (String, Int) -> String = { name, age ->"Hello $name$age"}println(sayHello("HanMei",18))
}

3)类型推断。

我们知道定义普通变量时,在编码阶段可以不用给变量指定类型。

当我们把匿名函数赋值给变量时,也可以不用指定函数的返回值类型,有编译器进行类型推断。

这时定义匿名函数时的“: () -> String”都可以省略。

无参数时的类型推断:

fun main() {val sayHello = {"Hello world!"}println(sayHello())
}

一个参数的类型推断:

参数定义和返回值定义可以省略。但是必须在函数定义中,指定参数类型和参数名。

fun main() {val sayHello={ name:String ->"Hello $name!"}println(sayHello("HanMei"))
}

多个参数的类型推断:

fun main() {val sayHello = { name: String, age: Int ->"Hello $name$age!"}println(sayHello("HanMei", 18))
}

6.lambda表达式:

我们将匿名函数称为lambda函数。将他的定义称为lambda表达式,他的返回结果称为lambda结果

7.定义参数是匿名函数的函数:函数的参数是另外一个匿名函数。

1)先定义一个具名函数,接收一个匿名函数为参数。

//定义一个具名函数,接收一个String参数和一个函数参数happyNewYear
//happyNewYear: (name: String, year: Int) -> String 这个就是匿名函数的定义
fun sayhello(name: String, happyNewYear: (name: String, year: Int) -> String) {val year = 2022//在具名函数中调用传递进来的匿名函数println(happyNewYear(name,year))
}

2)定义一个匿名函数,调用具名函数时,当作参数传递过去。


fun main() {//定义一个匿名函数val happyNewYear = { name: String, year: Int ->"${name},happy ${year}!"}//调用具名函数,并把匿名函数当作参数传递sayhello("HanMei", happyNewYear)
}

3)上面的匿名函数可以不单独定义,也可以在调用时定义实现。

这种写法和java中的匿名内部类是不是很像。方法的参数new一个接口,实现接口中的方法。

fun main() {sayhello("HanMei", happyNewYear = { name: String, year: Int ->"${name},happy ${year}!"})}

4)如果lambda是一个函数的最后一个参数,或者是唯一的参数。那么,括住lambda值参的一对圆括号可以去掉。

fun main() {sayhello("HanMei") { name: String, year: Int ->"${name},happy ${year}!"}
}

8.匿名函数,还可以用于扩展Kotlin的内置函数。

count是Kotlin用于计算字符串长度的内置函数。

  val word = "HappyNewYear"var count = word.count()

用匿名函数进行扩展

    count =  word.count({ letter ->letter == 'a'})

我们知道:当函数的最后一个参数或只有一个参数是lambda时,那对圆括号可以省略

count =  word.count { letter -> letter == 'a' }

我们又知道,当参数只有一个时,可以用it代替

count = word.count { it == 'a' }

9.函数的引用

要把函数作为参数传递给其他函数,除了lambda表达式,kotlin还提供了其他方法--函数引用

函数引用可以把一个具名函数转换成一个值参,传递给其他函数。

使用lambda表达式的地方,都可以使用函数引用。

1)首先定义两个具名函数:

happyNewYear就是一个普通函数。

sayhello可以接收一个函数参数。这个函数参数可以接收一个匿名函数,也可以接收一个函数引用。

fun happyNewYear(name: String, year: Int): String {return "$name happy $year"
}fun sayhello(name: String, happyNewYear: (name: String, year: Int) -> String) {val year = 2022println(happyNewYear(name, year))
}

2) 函数引用的使用:双冒号+函数名,就是这个函数的引用,可以当做值参传递

fun main() {//::happyNewYear这个就是函数的引用,sayhello("HanMei",::happyNewYear)
}

10.函数类型作为返回类型

一个函数的返回值,可以是另外一个函数,函数类型也是有效的返回值类型。

sayhello是一个无参的方法,返回值类型是(String) -> String,这个表达的意思就是一个参数为String类型,返回值为String类型的匿名函数。

fun sayhello(): (String) -> String {return {val year = 2022"$it happy $year"}
}

调用方法:

fun main() {//调用sayhello得到这个匿名函数,并赋值给变量happyNewYearval happyNewYear = sayhello();//happyNewYear就是一个匿名函数,可以直接传参调用println(happyNewYear("HanMei"))
}

注意上面的返回匿名函数有这样一句代码, val year = 2022;这个是定义在匿名函数中的。

也可以定义在外边的具名函数中,匿名函数仍然可以访问的到。

fun sayhello(): (String) -> String {val year = 2022return {"$it happy $year"}
}

这就是另外一个概念。闭包

在Kotlin中,匿名函数,能修改并引用定义在自己作用域之外的变量,匿名函数引用着定义自身的函数里的变量。也就是说sayhello返回的匿名函数,可以引用定义它的函数sayhello的变量。

Kotlin的lambda就是闭包。

Kotlin(四)匿名函数相关推荐

  1. 【Kotlin】Kotlin 函数总结 ( 具名函数 | 匿名函数 | Lambda 表达式 | 闭包 | 内联函数 | 函数引用 )

    文章目录 一.函数头声明 二.函数参数 1.默认参数值 2.具名参数 三.Unit 函数 四.TODO 函数抛出异常返回 Nothing 类型 五.反引号函数名 六.匿名函数 七.匿名函数的函数类型 ...

  2. Javascript第四章匿名函数第七课

    匿名函数的作用: 1.用于回调 2.一次性执行函数 Javascript第四章定义函数的形式.回调函数第五课 https://blog.csdn.net/qq_30225725/article/det ...

  3. Kotlin读书笔记之内联函数、扩展函数、匿名函数、lambda

    本文主要涉及内联函数.扩展函数.lambada以及匿名函数等.作为读书笔记对于细节深入没有过多的扩展,后续将对于各个知识点作进一步的研度.本文的内容主要是参考官方教程以及博客内容,作为读书笔记以及后续 ...

  4. python基础十四之匿名函数

    匿名函数 处理简单问题的简化函数,关键字lambda. # 格式:函数名 = lambda 参数:返回值 anonymity = lambda s: s ** 0.5 print(anonymity( ...

  5. python第二阶段第四天 装饰器和匿名函数

    装饰器 #######装饰器 装饰器:修饰别人的工具,修饰添加功能,工具指的是函数 装饰器本身可以是任何可调用对象,被装饰的对象也可以是任意可调用对象 为什么要用装饰器: 开放封闭原则:对修改是封闭的 ...

  6. Matlab自学笔记四:调用函数基本方法、传递参数、函数工作区、命令语法、调用匿名函数

    1.调用函数的基本方法 题目:创建函数y=x²+x+1 首先,使用上一篇的创建函数文件的方法(推荐先看上一篇:Matlab创建函数文件.函数语法定义.匿名函数.多元函数.局部函数等知识串联理解),创建 ...

  7. 学习Kotlin(四)对象与泛型

    推荐阅读: 学习Kotlin(一)为什么使用Kotlin 学习Kotlin(二)基本语法 学习Kotlin(三)类和接口 学习Kotlin(四)对象与泛型 学习Kotlin(五)函数与Lambda表达 ...

  8. javascript的匿名函数

    古人有"授之以鱼,不如授之以渔" ,没有老师,就只能自己学"渔"了.还是从简单的开始吧! 下面的这几句代码是最熟悉不过的了,但是你知道为什么这么写吗?为什么在页 ...

  9. 4.04Day14递推、三元表达式、列表/字典推导式、匿名函数

    复习:1.迭代器:不需要索引的取值方式2.生成器:通过特殊的语法自定义的迭代器3.枚举对象:为可迭代对象创建索引(按照迭代的顺序创建索引) 迭代器对象:装有多个值的容器 1. 可用通过.__next_ ...

最新文章

  1. 设计师不应该错过的响应式设计框架(含优缺点分析)
  2. .NET中IDisposable接口的基本使用
  3. Windows核心编程的官方网站
  4. tomcat 绑定ipv4端口
  5. android之inflater用法
  6. 2019年第十届蓝桥杯 - 省赛 - C/C++研究生组 - G. 扫地机器人
  7. Mono 2.0正式发布了
  8. Java中的堆栈和队列
  9. 实例33:python
  10. java接口如何接受语音参数_Java 是如何优雅地实现接口数据校验的?
  11. linux-bzip2压缩
  12. Java程序员最常用的20%技术总结
  13. delphi switch语句例子_Python系列之常用语句
  14. Oracle安装教程
  15. python写彩票程序30选7_写一个彩票程序:30选7
  16. java为什么用咖啡?
  17. Tilera吴晓东:2013年要做成三百多个核
  18. 微软云Blob存储账号使用——Java使用
  19. 使用Ruby搭建Redis 集群
  20. 解决pycharm终端/cmd运行python脚本报错“ImportError/ModuleNotFoundError:No Module named ...”

热门文章

  1. 当心情郁闷烦躁,没心情奋斗
  2. (四)play之yabe项目【页面】
  3. 移动端滑动验证为什么整个屏幕都在动?
  4. 阿里云服务器ECS搭建网站完整方法教程
  5. 【渝粤教育】国家开放大学2018年春季 8612-21T传染病护理学 参考试题
  6. python画熊猫代码_超清字符画——Python代码
  7. 标准IO:fseek/rewind/ftell 文件IO:lseek
  8. div 边框 边距设置
  9. 016:cesium 根据坐标值半径高度等,显示圆锥体
  10. simatic net opc scout OPC.SimaticNet下没有DP服务