高阶函数

  以另一个函数作为参数或者返回值的函数被称为高阶函数。

函数类型

//隐式声明(省略了变量类型)
val sum = (x:Int, y:Int -> x+y)
val action = { println("aaa") } //上面等价于下面的显式声明
val sum: (Int, Int) -> Int = (x:Int, y:Int -> x+y)
val action: () -> Unit = { println("aaa") }

调用作为参数的函数(同样也可以作为返回值)

fun plus(sum1: (Int,Int) -> Int){
var res=sum1(2,3)
return res
} >>>val sum = (x:Int, y:Int -> x+y) //这里x ,y必须带数据类型,因为没有上下文可以推导
>>>println(plus(sum)) //这个sum是上面声明的sum
5 >>>val res = plus(sum){ v1, v2 -> v1+v2 } //根据plus方法需要的参数类型来推断v1,v2的类型
>>>println(plus(sum))
5

参数默认值

//函数的参数可以指定默认值,建议带默认值的参数放在后面
fun show(v1:Int,v2:Int=2,v3:Int=3){
println("v1 = $v1\nv2 = $v2\nv3 = $v3")
} //调用
>>>shwo(9,8,7)
v1 = 9
v2 = 8
v3 = 7 >>>show(9)
v1 = 9
v2 = 2
v3 = 3 >>>show(9,8)
v1 = 9
v2 = 8
v3 = 3

内联函数:消除lambda带来的运行时开销

  lambda表达式会被编译成匿名类,所以每次被调用都会有一个类额外被创建,如果lambda每捕捉到一个变量,就会新创建一个对象。这样无疑增大了运行时的开销。

  我们可以使用内联函数来消除这样的缺陷。

  内联函数如何运作

    当一个函数被声明为inline时,它的函数体是内联的--------换句话说,函数体会被直接替换到函数被调用的地方,而不是被正常调用。

//使用inline来修饰函数,表示为内联函数
inline fun m(value:(Int)->Unit){
value(2)
} //调用内敛函数时,相当于把函数代码替换到调用处了
fun main(args: Array<String>) {
m{v->println(v)}
} //相当于下面
fun main(args: Array<String>) {
var v={ value:Int->println(value) }
v(2)
}

  内联函数的限制

    并不是所有使用Lambda表达式的函数都可以被内联。前提条件是作为参数传递进去的Lambda表达式被直接调用,或作为参数传递。这样的函数才可以被内联。因为lambda表达式可以直接被替换进去。

    如果函数中用变量保存了作为参数的lambda表达式,以便后面其他地方可以使用,这样的函数是不可以被内联的。会抛出错误“ Illegal usage of inline-parameter ”(非法使用内联函数)

     

kotlin学习(7)高阶函数的更多相关文章

  1. Python学习笔记 - 高阶函数

    高阶函数英文叫Higher-order function.什么是高阶函数?我们以实际代码为例子,一步一步深入概念. 变量可以指向函数 以Python内置的求绝对值的函数abs()为例,调用该函数用以下 ...

  2. python学习之高阶函数

    filter函数:filter()为已知的序列的每个元素调用给定的布尔函数,调用中,返回值为非零的元素将被添加至一个列表中 list = filter(调用函数名,可迭代对象)——调用函数名自动传参— ...

  3. python进阶学习之高阶函数

    高阶函数就是把函数当做参数传递的一种函数, 例如: 执行结果: 1.map()函数 map()接收一个函数 f 和一个list, 并通过把函数 f 依次作用在 list 的每个元素上,得到一个新的 l ...

  4. python学习笔记——高阶函数map()

    满足以下两点中任意一点,即为高阶函数: 1.函数接收一个或多个函数作为参数 2.函数返回一个函数 1 描述 用函数和可迭代对象中每一个元素作为参数,计算出新的迭代对象 map() 会根据提供的函数对指 ...

  5. 学习python3高阶函数笔记和demo

    python的高阶函数的定义是:一个函数接收另一个函数作为参数,这种函数就称之为高阶函数 举一个最简单的例子: def text(a,b,c): return c(a)+c(b) print( tex ...

  6. Python学习之高阶函数--嵌套函数、函数装饰器、含参函数装饰器

    玩了一晚上王者,突然觉得该学习,然后大晚上的搞出来这道练习题,凌晨一点写博客(之所以这么晚就赶忙写是因为怕第二天看自己程序都忘了咋写的了),我太难了o(╥﹏╥)o 言归正传,练习题要求:构造类似京东的 ...

  7. Kotlin高阶函数实战

    前言 1. 高阶函数有多重要? 高阶函数,在 Kotlin 里有着举足轻重的地位.它是 Kotlin 函数式编程的基石,它是各种框架的关键元素,比如:协程,Jetpack Compose,Gradle ...

  8. JavaScript学习笔记(十)——高阶函数之map,reduce,filter,sort

    在学习廖雪峰前辈的JavaScript教程中,遇到了一些需要注意的点,因此作为学习笔记列出来,提醒自己注意! 如果大家有需要,欢迎访问前辈的博客https://www.liaoxuefeng.com/ ...

  9. Kotlin——高级篇(二):高阶函数详解与标准的高阶函数使用

    在上面一个章节中,详细的讲解了Kotlin中关于Lambda表达式的语法以及运用,如果还您对其还不甚理解,请参见Kotlin--高级篇(一):Lambda表达式详解.在这篇文章中,多次提到了Kotli ...

  10. python函数式编程之高阶函数学习

    基本概念 函数式编程,是一种抽象程度很高的编程范式,纯粹的函数式编程语言编写的函数没有变量.因此,任意一个函数,只要输入确定,输出就确定的这种函数我们称之为纯函数,我们称这种函数没有副作用.而允许使用 ...

随机推荐

  1. sqlserver 返回刚插入的那条数据

    insert into xxxxxx(Col_002,UrgentStatus,DoWorkShop,Col_004,Col_005,Col_006,Col_003,Col_007,postQQ,Co ...

  2. sh_09_print函数的结尾

    sh_09_print函数的结尾 # 在默认情况下,print 函数输出内容之后,会自动在内容末尾增加换行 print("*", end="---") prin ...

  3. HTTP深入浅出http请求(转)-----http请求的过程和实现机制

    摘要:此文章大概讲明了http请求的过程和实现机制,可以作为了解,至于请求头和响应头的具体信息需要查看下一篇随笔:Http请求详解(转)----请求+响应各字段详解   HTTP(HyperText ...

  4. 图的深度优先搜索(DFS)和广度优先搜索(BFS)算法

    深度优先(DFS) 深度优先遍历,从初始访问结点出发,我们知道初始访问结点可能有多个邻接结点,深度优先遍历的策略就是首先访问第一个邻接结点,然后再以这个被访问的邻接结点作为初始结点,访问它的第一个邻接 ...

  5. Linux下服务器开发的必要准备

    一.Windows下安装Xshell 二.Linux开启SSH 可以先查询有没有SSH服务 sudo ps -e |grep ssh 没有安装SSH的服务器 sudo apt-get install ...

  6. WIN10下安装Linux子系统并安装xface4界面

    WIN10下安装Linux子系统并安装xface4界面,使用win10自带的远程桌面工具登陆成功. 成功截图: 安装步骤 1.安装[适用于Linux的Windows子系统]组件 2.win10应用商店 ...

  7. always_populate_raw_post_data

    Deprecated: Automatically populating $HTTP_RAW_POST_DATA is deprecated and will be removed in a futu ...

  8. architecture 20190628

    https://abp.io/  --ABP v2 官网 https://grpc.io/ --gRPC官网 https://devblogs.microsoft.com/dotnet/introdu ...

  9. webpack安装低于4版本(没有配置webpack.config.js)

    webpack安装低于4版本(没有配置webpack.config.js) webpack 无需配置输出参数-o 低版本  1.初始化项目 npm init -y 初始化项目 2.安装webpack@ ...

  10. nginx请求转发配置

    以下为无ssl证书配置的请求转发 server { listen ; server_name api.****.com; #以下为指定请求域名匹配到某一个端口 #location ~* /union ...