kotlin函数
1.概念
函数是执行操作并可以返回值的离散代码块。在 Kotlin 中,函数是使用 fun 关键字声明的,并且可以使用接收具名值或默认值的参数。与特定类关联的函数称为方法。
- 一个用于执行特定任务的代码块
- 它可以将大型的程序分解为小型的模块
- 使用关键字 fun 来声明
- 可以通过参数接收具名值或默认值
2.函数的组成部分
fun sayHello(text:String) :Unit{
println("hello world!")
}
其中 sayHello就是函数名,小括号()内text是函数参数,大括号{}中是函数具体代码,Unit是返回值(当函数没有任何返回的时候,那它的返回值便是Unit。Unit 类型只包含一个值,即:Unit 。返回Unit类型的声明是可选的。)。
以上函数等价于:
fun sayHello(text:String){
println("hello world!")
}
2.1函数参数
函数可能会有:
默认参数
必选参数
具名参数
我们重新编写一个 sayHello 函数,这个函数接收一个 String 类型的参数: name,并且会打印出输入的姓名。name 的默认值为 "张三"。
fun sayHello(name: String = "张三") {
println("你好:${name}")
}
sayHello() =>你好:张三
sayHello("李四") =>你好:李四
sayHello(name="王五") =>你好:王五
在 main() 函数中,有三种方法可以调用 sayHello() 函数:
- 在调用函数时,使用默认参数;
- 调用函数时,不使用参数名传入 speed;
- 调用函数时,传入名为 speed 的参数。
如果没有为某个参数指定默认值,则该参数为必选参数。
fun sayHello(name: String) {
println("你好:${name}")
}
sayHello() =>编译错误:Kotlin: No value passed for parameter 'name'
sayHello("李四") =>你好:李四
sayHello(name="王五") =>你好:王五
为了提升可读性,可以向必选参数传入具名值。就是我们上述代码中的 sayHello(name="王五")调用方式 。
函数可以同时拥有默认参数和必选参数。我们改造一下sayHello函数 。
fun sayHello(name: String, age: Int = 6, sex: String = "男") {
println("你好:${name} ,你的年龄:$age ,你的性别:$sex")
}
sayHello(name = "王五") =>你好:王五,你的年龄:6,你的性别:男
sayHello("王五",sex = "女") =>你好:王五 ,你的年龄:6 ,你的性别:女
参数可以通过它们的名称进行传递 (具名参数)。在函数包含大量参数或者默认参数时,具名参数非常方便。默认参数和具名参数可以减少重载并优化代码可读性。
3.紧凑函数
如果一个函数只返回了一个表达式,那么它的大括号可以省略,而函数体可以在 “=” 符号后指定。
fun getSum(x: Int, y: Int): Int { =>完整版
return x + y
}
fun getSum(x: Int, y: Int): Int = x + y =>紧凑版
4.Lambda 表达式与高阶函数
Kotlin 中函数是 first-class(头等函数)
- Kotlin 的函数可以储存在变量和数据结构中
- 函数可以作为其他高阶函数的参数和返回值
- 可以使用高阶函数创建新的 “内建” 函数
4.1 Lambda 函数
除了传统的命名函数外,Kotlin 还支持 lambda 表达式。lambda 是用来创建函数的表达式,但不同于声明已命名的函数,以这种方式声明的函数没有名称。lambda 很好用的一点便是可以作为数据传递。在其他编程语言中,lambda 也被称为匿名函数、函数字面量或其他类似的名称。
像具名函数一样,lambda 也可以有参数。对于 lambda 来说,参数 (及其类型,如果需要声明的话) 位于函数箭头 -> 的左侧。要执行的代码在函数箭头的右侧。将 lambda 赋值给变量后,就可以像函数一样调用它。
kotlin可以声明一个存储函数的变量
val getSum = { x: Int, y: Int -> x + y }
println(getSum(1, 2)) =>3
其中x,y就是参数。->为函数箭头 ,需要执行的代码再其右侧。其中getSum就是变量名。
4.2高阶函数
高阶函数接收函数作为参数,或以函数作为返回值。
fun getSum(x: Int, y: Int, sum: (Int, Int) -> Int): Int {
return sum(x, y)
}
val sum: (Int, Int) -> Int = { x, y -> x + y }
println(getSum(1, 2, sum)) =>3
此段代码中函数体调用了作为第三个参数传入的函数,并将第一个第二个参数传递给该函数。
lambda 的真正作用在于可以使用它们创建高阶函数,高阶函数接收另一个函数作为参数。
使用函数类型可将其实现与使用处分离。
4.3传递函数引用
使用:: 操作符将具名函数作为参数传入另一个函数。
fun sum(x: Int, y: Int): Int {
return x + y
}
println(getSum(1, 2, ::sum))
:: 操作符让 Kotlin 知道我们正在将函数引用作为参数传递,这样一来 Kotlin 便不会尝试调用该函数。
在使用高阶函数时,Kotlin 倾向于将接收函数的参数作为函数的最后一个参数。Kotlin 有一个特别的语法,叫做尾随参数调用语法,可以让我们的代码更加简洁。在下面代码中中,我们可以为函数参数传递一个 lambda,而不必将 lambda 放在括号中。
println(getSum(1, 2,{ x, y -> x + y }) )
等价于
println(getSum(1, 2) { x, y -> x + y })
Kotlin 内建的许多函数,其声明方式都遵循了尾随参数调用语法。
inline fun repeat(times: Int, action: (Int) -> Unit)
repeat(3) {
println("hello world!")
}