Kotlin笔记 六 (二)高阶函数.md

本文深入探讨Kotlin中的函数类型,包括如何定义、使用函数类型作为变量、参数和返回值,以及局部函数的作用域扩展。通过实例展示了高阶函数和动态逻辑传递的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、函数类型

Kotlin融合了面向过程的特征,而我们知道面向过程中函数和基本数据(整数、布尔等)都是一样的地位,同样也具有数据类型;既可定义变量,也可以当做函数的形参类型;

函数类型:由参数列表、->、返回值类型组成的;

必须括号来包裹参数类型,多个参数类型由逗号隔开: (参数类型1,参数类型2,…)->返回值类型

如:

	fun foo(a:int,name:String):Unit{}

所以该函数类型就是:(Int,String)->Unit

  1. 即使没有参数括号也不能省略
  2. 即使返回值类型Unit也不能省略

如:

fun foo():Unit{
}

函数类型为()->Unit

如果是高阶函数比如:返回值是函数类型呢?

如:

(Int)->((Int,String)->Unit)

传入一个Int类型参数,返回一个(Int,String)->Unit类型的函数。为了简化他的表达 ,也可以省略掉后半部分的括号:

(Int)->(Int,String)->Unit

当做变量:

1、定义变量:var myFun:(Int)->Unit

2、定义函数:fun foo(a:Int){}

3、将函数赋值给变量:myFun=::foo

注意:

  1. 访问一个函数(数据)的引用,需要在函数名前添加两个“::”;
  2. "函数名()"表示的调用函数,函数名并不是一个表达式,不具有类型信息,它在带上括号调用执行后,才存在值;

1.1、 函数类型的变量作为函数形参

当定义一个函数,该函数的大部分逻辑都已确定,但某个逻辑可能需要根据不同情况需要动态改变,也就是需要动态传入这些代码,这时传入不同的函数作为参数,实现不同的逻辑;



	如: fun calulate(a:Int,b:Int){
		

		var result:Int=0;

		//1.计算和

		//2.计算乘级


		}

就可以定义一个函数类型的形参,来实现不同逻辑。写成这样:

	fun calulate(a:Int,b:Int,sum:(Int,Int)->Int){

		..........
			sum(a,b)

		}



	fun sum(a:int,b:Int):Int{
		
		return a+b
	
		
	}


调用:
	calulate(2,3,::sum)

这样就随着实际传入的函数

1.3、函数类型的变量作为函数返回值

fun calculate(type: String): (Int) -> Int {

    fun square(n: Int): Int {
        return n * n
    }

    fun cube(n: Int): Int {
        return n * n * n
    }
    fun factorial(n:Int):Int{
        var result=1;
        for (index in 2..n){
            result*=index
        }
        return  result

    }

    when (type) {

        "square" -> return ::square
        "cube" -> return ::cube
        else -> return ::factorial
    }

}

fun main(args: Array<String>) {
    val squar = calculate("square")
    println(squar(3))


}

这里补充一点的是:在calculate()函数中定义了三个局部变量,那么三个局部函数的作用域只限于这个函数内使用;但是将局部函数赋值给变量,这三个局部变量的作用域就和这变量的作用域一样,如果这变量时全局变量,那么自然局部函数的作用域也变成了全局;

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值