大家好,今天小编来为大家解答深入解析:高级函数与匿名函数表达技巧这个问题,很多人还不知道,现在让我们一起来看看吧!
funlock(lock: 锁, body: () -T): T {
锁.lock()
尝试{
返回主体()
}
最后{
锁定.解锁()
}
我们来检查一下上面的代码:body 有函数类型:() -T,
所以它应该是一个不带参数并返回T类型值的函数。
它在try{:keyword} 代码块内调用并受锁保护,其结果由lock() 函数返回。
如果我们想调用lock()函数,我们可以将另一个函数作为参数传递给它(参见函数参考):
有趣的toBeSynchronized()=共享资源.操作()
val result=lock(lock,toBeSynchronized) 另一种通常更方便的方法是传递lambda 表达式:
val result=lock(lock, { sharedResource.operation() }) 下面更详细地描述了Lambda 表达式,但为了继续本段,让我们看一下简短的概述:
lambda 表达式始终用花括号括起来,其参数(如果有)在- 之前声明(参数类型可以省略),函数体(如果存在)在- 之后。在 Kotlin 中有一个约定,如果函数的最后一个参数是一个函数,并且你传递一个 lambda 表达式作为相应的参数,你可以在圆括号之外指定它:
锁(锁){
共享资源.操作()
}
//原来的
lock(lock, {sharedResource.operation()}) 高阶函数的另一个例子是map():
funList.map(transform: (T) -R): 列表{
val 结果=arrayListOf()
对于(本项中的项目)
结果.add(变换(项目))
返回结果
}可以如下调用:函数
val doubled=ints.map { 值- 值* 2 }
//原来的
val doubled=ints.map({ 值- 值* 2 })
//最后一个参数是函数,lambda作为参数传递,可以在括号外指定
val doubled=ints.map(){ 值- 值* 2}
//lambda是唯一参数,括号可以省略
val doubled=ints.map{ value -value * 2}请注意,如果 lambda 是该调用的唯一参数,则调用中的圆括号可以完全省略。
it:单个参数的隐式名称
另一个有用的约定是,如果函数文字只有一个参数,
那么它的声明就可以省略(连同-),它的名字就是it。 ints.map { it * 2 } 这些约定允许编写LINQ 样式的代码:
strings.filter { it.length==5 }.sortBy { it }.map { it.toUpperCase() }
下划线用于未使用的变量(自 1.1 起)
如果不使用lambda 表达式的参数,则可以将其名称替换为下划线:
map.forEach { _, value -println("$value!") }
在 lambda 表达式中解构(自 1.1 起)
lambda 表达式中的解构被描述为解构声明的一部分。
内联函数
使用内联函数有时可以提高高阶函数的性能。
Lambda 表达式和匿名函数
lambda 表达式或匿名函数是“函数文字”,即未声明的函数,
但它会立即作为表达式传递。考虑以下示例:
max(strings, { a, b -a.length b.length }) 函数max 是一个高阶函数,换句话说,它接受一个函数作为第二个参数。
它的第二个参数是一个表达式,它本身就是一个函数,即函数字面量。写成函数,相当于
fun Compare(a: String, b: String): Boolean=a.length b.length
函数类型
对于接受另一个函数作为参数的函数,我们必须指定参数的函数类型。
例如,上述函数max定义如下:
funmax(collection: 集合,less: (T, T) -Boolean): T? {
var max: T?=空
对于(它在集合中)
if (max==null || less(max, it))
最大值=它
返回最大值
}参数less的类型为(T,T)-Boolean,即接受两个T类型参数并返回布尔值的函数:
如果第一个参数小于第二个参数,则此函数返回true。
上面第4行代码中,less被用作函数:通过传入两个T类型的参数来调用。
如上所述,它是一个函数类型,或者如果您想记录每个参数的含义,它可以具有命名参数。
val Compare: (x: T, y: T) -Int=……var sum: ((Int, Int) -Int)?=null
Lambda 表达式语法
Lambda表达式的完整语法形式,即函数类型的字面值如下:
val sum={ x: Int, y: Int -x + y } lambda 表达式始终用大括号括起来,
参数声明的完整语法形式包含在括号中,带有可选的类型注释,
函数体后面有一个- 符号。如果lambda 推断的返回类型不是Unit,则lambda 主体中的最后一个(或可能是单个)表达式将被视为返回值。
如果我们保留所有可选注释,它看起来像这样:
val sum: (Int, Int) -Int={ x, y -x + y } lambda 表达式通常只有一个参数。
ints.filter { it 0 } //该文字的类型为“(it: Int) -Boolean”。我们可以使用限定返回语法从lambda 显式返回一个值。否则,将隐式返回最后一个表达式的值。因此,以下两个片段是等效的:
ints.filter {
val shouldFilter=it 0
应该过滤
}
ints.filter {
val shouldFilter=it 0
return@filter 应该过滤
}请参阅callSuffix 的语法。
匿名函数
——如果确实需要明确指定,可以使用另一种语法:匿名函数。
fun(x: Int, y: Int): Int=x + yfun(x: Int, y: Int): Int {
返回x + y
}ints.filter(fun(item)=item 0)--指定(或假定为Unit)。
-- 始终在使用fun{:keyword} 关键字声明的函数中返回。这意味着lambda 表达式中的return{:keyword}
将从包含它的函数中返回,而在匿名函数中返回{:keyword}
将从匿名函数本身返回。
闭包
Lambda 表达式或匿名函数(以及本地函数和对象表达式)
它的闭包,即在外部作用域中声明的变量是可以访问的。与Java 不同,闭包中捕获的变量可以修改:
变量总和=0
ints.filter { it 0 }.forEach {
总和+=它
}
print(sum)
带接收者的函数字面值
Kotlin 提供了使用指定接收者对象调用函数文字的功能。
在函数文字的函数体内,可以调用该接收者对象上的方法,而无需任何附加限定符。
这类似于扩展函数,它允许您访问函数体内接收者对象的成员。
其最重要的用法示例之一是类型安全的Groovy 风格构建器。
这种函数文字的类型是带有接收器的函数类型:
sum : Int.(other: Int) -Int 可以像调用接收者对象上的方法一样调用此函数文字:
1.sum(2) 匿名函数语法允许您直接指定函数文字的接收者类型。
如果您需要使用带有接收器的函数类型来声明变量并稍后使用它,这非常有用。
val sum=fun Int.(other: Int): Int=this + other 当可以从上下文推断接收者类型时,lambda 表达式可以用作接收者的函数文字。
类HTML {
有趣的身体(){……}
}
有趣的html(init: HTML.() -Unit): HTML {
val html=HTML() //创建接收者对象
html.init() //将接收者对象传递给lambda
返回HTML
}
html { //带有接收器的lambda 从这里开始
body() //调用接收者对象的方法
【深入解析:高级函数与匿名函数表达技巧】相关文章:
2.米颠拜石
3.王羲之临池学书
8.郑板桥轶事十则
用户评论
终于开始学习高级的Python概念了!
有19位网友表示赞同!
以前总觉得这些东西很抽象,现在慢慢理解了。
有18位网友表示赞同!
lambda表达式真方便啊,简洁直接!
有10位网友表示赞同!
感觉高阶函数打开了新的编程大门。
有17位网友表示赞同!
终于知道为什么别人都说它们是Python的强大之处!
有12位网友表示赞同!
这篇文章讲解得很好,我理解了 lambda 表达式的用法。
有17位网友表示赞同!
高阶函数听起来很复杂,但其实用起来挺 intuitive 的!
有14位网友表示赞同!
以前没接触过这些概念,现在开始探索,感觉很新奇的学习体验。
有8位网友表示赞同!
分享一下实践中的感受,高阶函数确实可以提升代码效率!
有10位网友表示赞同!
这种写法更加优雅,比传统的写法更简洁。
有8位网友表示赞同!
我正在研究如何在实际项目中应用高阶函数。
有13位网友表示赞同!
希望以后能熟练运用这些高级知识,提升编程能力。
有20位网友表示赞同!
感觉学习Python越来越有意思了,充满挑战性和收获。
有6位网友表示赞同!
这篇文章让我对代码的结构有更深的理解!
有11位网友表示赞同!
高阶函数让代码更加灵活,可以根据需要进行调整和扩展。
有13位网友表示赞同!
我要好好练习一下这些知识,争取把它们理解透!
有14位网友表示赞同!
学习到新的东西总是让人兴奋!
有12位网友表示赞同!
这个概念颠覆了我之前的思维方式!
有12位网友表示赞同!
感觉掌握了高阶函数和 lambda 表达式,Python 的技能就更上一层楼了!
有5位网友表示赞同!