首页 > 其他分享 >kotlin高阶函数(1)——将函数作为参数传递

kotlin高阶函数(1)——将函数作为参数传递

时间:2023-02-02 14:32:50浏览次数:69  
标签:函数 Int kotlin 参数传递 类型 参数 fun 高阶

kotlin高阶函数(1)——将函数作为参数传递

问题背景

kotlin语言中,有个高阶函数的概念,那么什么是高阶函数呢? 高阶函数的定义:一个函数如果参数类型是函数或者返回值类型是函数,那么这就是一个高阶函数。 现在我们来看第一个:Kotlin 支持函数作为参数传递,无需构建对象来包装函数。

问题分析

(1)函数类型

kotlin 中,有整型 Int、字符串类型 String,同样函数也有类型,举个例子:

fun add(num1: Int, num2: Int): Int {
    return num1 + num2
}

这个 add 函数的函数类型就是 (Int, Int) -> Int,函数类型其实就是将函数的 “参数类型” 和 “返回值类型” 抽象出来。 那么怎么给 c 这个变量赋值呢?具体写法如下所示:

val c: (Int, Int) -> Int = ::add
fun add(num1: Int, num2: Int): Int = num1 + num2

::add 这种写法是一种函数引用方式的写法。除了函数引用这种方式外,Kotlin 还支持用 Lambda 表达式对一个函数类型的变量进行赋值。如下所示: val c: (Int, Int) -> Int = {num1: Int, num2: Int -> num1 + num2} 实际项目中,绝大多数情况下我们都是用 Lambda 表达式来调用高阶函数的。 Lambda 表达式语法结构:{参数名1: 参数类型, 参数名2: 参数类型 -> 函数体} 函数体中可以编写任意行代码,最后一行代码会自动作为 Lambda 表达式的返回值 了解了函数类型和高阶函数的定义,我们很简单的就可以定义高阶函数了,如下所示:

// 参数是函数类型的高阶函数
fun higherFunction(func: (Int, Int) -> Int) {
    
}
// 返回值是函数类型的高阶函数
fun higherFunction(): (Int, Int) -> Int {

}    

(2)高阶函数传无参数函数

fun say() {
        println("Hello World")
    }
 
    /**
    * 在 Kotlin 中无返回为 Unit
    *
    * 此方法接收一个无参数的函数并且无返回
    *
    * 使用参数名加 () 来调用
    */
    fun people(hello: () -> Unit) {
        hello()
    }
 
    /**
    * 在 kotlin 中有一个约定,如果最后一个参数是函数,可以省略括号
    */
    fun main() {
        people ({ say() })
        people { say() }
    }

运行程序打印“Hello World”,没有问题 image.png

(3)高阶函数传有参数函数

写法一:

fun say(msg: String) {
    println("Hello $msg")
}

/**
 * 当调用的函数有形参时,
 * 需要在调用的函数声明,并使用声明的形参;
 * 函数参数中的形参无法使用
 */
fun people(arg0: String, hello: (arg1: String) -> Unit) {
    hello(arg0)
}

fun main() {
    people("Android") {
        say("World")
    }
}

运行结果如下: image.png 那么问题来了,传入的arg0似乎没有生效,我们来看看正常写应该咋写? 我们传参不写成Lambda表达式应该是下面这种: image.png 编译器会提示我们优化,如上截图的下滑黄线,用鼠标放上去点即可,优化最后: image.png 这才是正确的Lambda表达式写法,其实在编译器上看前一种写法也比较明显,在传入形参it后,我们重新付了一个值。 image.png 当然,不用Lambda表达式的写法如下,也是可以的: image.png 查看运行结果: image.png

问题总结

初步介绍了kotlin语言中,高阶函数传参将函数作为参数传递,抛砖引玉,有兴趣的朋友可以进一步深入了解。

标签:函数,Int,kotlin,参数传递,类型,参数,fun,高阶
From: https://blog.51cto.com/baorant24/6033549

相关文章

  • 使用库函数qsort
    先在MSDN上了解一下qsort的大致内容。voidqsort(void*base,size_tnum,size_twidth,int(__cdecl*compare)(constvoid*elem1,constvoid*elem2));第一个......
  • 创建函数替代qsort函数
    #include<stdio.h>voidswap(char*p1,char*p2,intwidth){intn=0;for(n=0;n<width;n++){chartmp=*p1;*p1=*p2;*p2=tmp;p1++;......
  • 利用腾讯云函数上线CS
    首先,我们需要登录腾讯云,开启云函数。登录腾讯云后,搜索云函数。开通即可。初次登录,需要授权。登录控制台后,点击新建。函数名称随意,选择从头开始,环境填Python3.6,选完后下拉,把......
  • PostgreSQL - raise函数打印字符串
    raise函数在PostgreSQL中,该函数用于打印字符串,类似于Java中的​​System.out.println()​​​,Oracle中的​​dbms_output.put_line()​​。用法如下:raisenotice'Mynamei......
  • 函数指针实现加法操作
    1doubleadd(doublex,doubley)2{3returnx+y;4}56//double(*Calulate)(double,double);//声明一个函数指针789doubleCalulate(do......
  • gp4版本安装uuid函数
    1.确认gp的安装目录有python文件夹cd/usr/local/greenplum-db-4.3.17.1/ext/2.安装python扩展      createlangplpythonu-ddatabasename图中的错误提示是......
  • python 的钩子函数
    一、什么是钩子函数hook函数就是在一定条件下才会执行的函数,将自己实现的函数挂载到挂载点上1.hook函数:就是我们自己实现的函数,函数类型与挂载点匹配(返回值,参数列表)2.......
  • JavaScript 中URL构造函数
    前言URL对于我们开发人员来讲,应该是非常熟悉了。在对URL进行参数拼接时,我们一般都会直接进行字符串拼接或使用模版字符串,因为这样非常方便,但是我们这样其实会在不知不觉......
  • 读Java8函数式编程笔记08_测试、调试和重构
    1. Lambda表达式的单元测试1.1. 单元测试是测试一段代码的行为是否符合预期的方式1.2. Lambda表达式没有名字,无法直接在测试代码中调用1.2.1. 将Lambda表达式放入......
  • Linux系统Shell脚本第四章:shell函数
    目录一、shell函数1、函数的作用2、函数使用步骤3、定义函数基本格式4、函数变量5、退出函数6、函数位置变量与脚本位置变量区别 一、shell函数1、函数的作用定......