注册

kotlin函数

1.概念

函数是执行操作并可以返回值的离散代码块。在 Kotlin 中,函数是使用 fun 关键字声明的,并且可以使用接收具名值或默认值的参数。与特定类关联的函数称为方法。

  • 一个用于执行特定任务的代码块
  • 它可以将大型的程序分解为小型的模块
  • 使用关键字 fun 来声明
  • 可以通过参数接收具名值或默认值


2.函数的组成部分

我们可以使用 fun 关键字,并紧跟一个函数名来定义一个函数。例如:
fun sayHello(text:String) :Unit{
println("hello world!")
}

其中 sayHello就是函数名小括号()内text是函数参数大括号{}中是函数具体代码Unit是返回值(当函数没有任何返回的时候那它的返回值便是UnitUnit 类型只包含一个值,即: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!")
}

0 个评论

要回复文章请先登录注册