kotlin学习(7)高阶函数
高阶函数
以另一个函数作为参数或者返回值的函数被称为高阶函数。
函数类型
//隐式声明(省略了变量类型)
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)高阶函数的更多相关文章
- Python学习笔记 - 高阶函数
高阶函数英文叫Higher-order function.什么是高阶函数?我们以实际代码为例子,一步一步深入概念. 变量可以指向函数 以Python内置的求绝对值的函数abs()为例,调用该函数用以下 ...
- python学习之高阶函数
filter函数:filter()为已知的序列的每个元素调用给定的布尔函数,调用中,返回值为非零的元素将被添加至一个列表中 list = filter(调用函数名,可迭代对象)——调用函数名自动传参— ...
- python进阶学习之高阶函数
高阶函数就是把函数当做参数传递的一种函数, 例如: 执行结果: 1.map()函数 map()接收一个函数 f 和一个list, 并通过把函数 f 依次作用在 list 的每个元素上,得到一个新的 l ...
- python学习笔记——高阶函数map()
满足以下两点中任意一点,即为高阶函数: 1.函数接收一个或多个函数作为参数 2.函数返回一个函数 1 描述 用函数和可迭代对象中每一个元素作为参数,计算出新的迭代对象 map() 会根据提供的函数对指 ...
- 学习python3高阶函数笔记和demo
python的高阶函数的定义是:一个函数接收另一个函数作为参数,这种函数就称之为高阶函数 举一个最简单的例子: def text(a,b,c): return c(a)+c(b) print( tex ...
- Python学习之高阶函数--嵌套函数、函数装饰器、含参函数装饰器
玩了一晚上王者,突然觉得该学习,然后大晚上的搞出来这道练习题,凌晨一点写博客(之所以这么晚就赶忙写是因为怕第二天看自己程序都忘了咋写的了),我太难了o(╥﹏╥)o 言归正传,练习题要求:构造类似京东的 ...
- Kotlin高阶函数实战
前言 1. 高阶函数有多重要? 高阶函数,在 Kotlin 里有着举足轻重的地位.它是 Kotlin 函数式编程的基石,它是各种框架的关键元素,比如:协程,Jetpack Compose,Gradle ...
- JavaScript学习笔记(十)——高阶函数之map,reduce,filter,sort
在学习廖雪峰前辈的JavaScript教程中,遇到了一些需要注意的点,因此作为学习笔记列出来,提醒自己注意! 如果大家有需要,欢迎访问前辈的博客https://www.liaoxuefeng.com/ ...
- Kotlin——高级篇(二):高阶函数详解与标准的高阶函数使用
在上面一个章节中,详细的讲解了Kotlin中关于Lambda表达式的语法以及运用,如果还您对其还不甚理解,请参见Kotlin--高级篇(一):Lambda表达式详解.在这篇文章中,多次提到了Kotli ...
- python函数式编程之高阶函数学习
基本概念 函数式编程,是一种抽象程度很高的编程范式,纯粹的函数式编程语言编写的函数没有变量.因此,任意一个函数,只要输入确定,输出就确定的这种函数我们称之为纯函数,我们称这种函数没有副作用.而允许使用 ...
随机推荐
- Git的使用及安装
1安装. 步骤一 如果是32位就安装32位,64位就安装64,任选一款. 步骤二 步骤三 步骤四 步骤五 步骤六 步骤七 步骤八 步骤九 步骤十 步骤十一 上面的安装完成以后,下面的程序包按要求安装就 ...
- 创建一个简单的 Springboot web项目
1.点击Project 2.点击 Next 3.项目名 4.web 项目 4.确认 5.pom.xml <?xml version="1.0" encoding=" ...
- AJAX - 向服务器发送请求请求
AJAX - 向服务器发送请求请求 XMLHttpRequest 对象用于和服务器交换数据.直线电机生产厂家 向服务器发送请求 如需将请求发送到服务器,我们使用 XMLHttpRequest 对象的 ...
- Luogu P2309 loidc,卖卖萌
题目链接:Click here 题目大意:给你一个长度为n的数串,问这个数串的sum为正数的子串个数 Solution: 我们先处理以下前缀和,记为\(s_i\) 则问题可以转化为求有多少对\(i,j ...
- VGA/DVI/HDMI/DP/Type-C等常用显示接口对比介绍
在我们的生活中,无论是电脑.电视还是投影设备等等,都离不开视频输出接口,尤其在显卡上面,通常会出现3种甚至更多的接口.很多人并不了解其中的区别,觉得只要有画面输出就可以了,其实对于很多显示器来说并非如 ...
- C#获取网页信息并存入数据库
1,获取以及商品分类信息 给一网页获取网页上商品信息的分类 using Skay.WebBot; using System; using System.Collections.Generic; usi ...
- WebClient上传下载文件,小白篇
WebClient的上传文件一直报错,各种百度各种稀奇古怪的东西,终于百度到一篇小白学习篇 转自: https://www.cnblogs.com/cncc/p/5722231.html 使用C#We ...
- Getting CFNetwork SSLHandshake failed (-9806) error
平常个人打测试包一切OK,今天突然不能联网了 How to handle "CFNetwork SSLHandshake failed" in iOS 参考1 Getting CF ...
- linux inotify 监控文件系统事件
https://blog.csdn.net/cheng_fangang/article/details/41075515
- 使用System.ComponentModel.DataAnnotations验证字段数据正确性
在.NET MVC 中,当页面提交model到Action的时候,自动填充ModelState.使用ModelState.IsValid进行方便快捷的数据验证,其验证也是调用命名空间System.Co ...