Lambda 表达式在 kotlin 中的应用
原创...大约 2 分钟
一个例子
普通写法:
- 定义一个接口 OnClickListener
interface ClickListener{
fun onClick(view: View)
}
- 定义方法 SetOnClickListener
fun setOnCLickListener(listener: ClickListener){
this.listener = listener;
}
定义的方法和 Java 中写法类似,在使用该方法时也类似:
var testInterface = TestInterface()
testInterface.setOnCLickListener(object : TestInterface.ClickListener{
override fun onClick(view: View) {
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}
})
lambda 写法:
定义只需要一步:
//在初始化的时初始化 listener
class AClass(var listener : (uri:String) -> Unit){...}
//或者直接定义这个变量
listener:((uri : String)-> Unit)? = null
//在需要用到方法时,listener 的方法,比如 onClickListener(){}
listener.invoke(agrs)
使用起来也更加简洁:
var t = TestInterface{ uri: String -> print(uri) }//获取对象的同时初始化 listener
方法最后一个参数是 lambda 表达式时,lambda 表达式的方法
{}
可以放到()
的后面,如果只有这一个参数时,()
也可以省略
当方法只有一个参数时,可以省略参数,还用it
代替:
testInterface.setNewOnClickListener { print(it) }
甚至更加简洁,如果要执行的方法和 listener 定义的方法返回值类型相同,可以直接引用该方法:
testInterface.setNewOnClickListener(::print)
lambda
lambda 在 Java8 中引进,可以很好的替代匿名内部类,使代码更加简洁。
lambda 表达式形式如下:
val sum = { x: Int, y: Int -> x + y }
lambda 表达式总是被大括号括着,完整语法形式的参数声明放在大括号内,并有可选的类型标注,函数体跟在一个
->
符号之后。如果推断出的该 lambda 的返回类型不是Unit
,那么该 lambda 主体中的最后一个(或可能是单个)表达式会视为返回值。
使用 lambda 的形式如下() -> {}
,()
内是参数,{}
是函数具体的行为。
//Java 8 方式:
new Thread( () -> System.out.println("In Java8, Lambda expression rocks !!") ).start();
这个例子来自 importNew.com,Java8 lambda 表达式 10 个示例
小知识点
- xx.map()
凡是可迭代的数据都可以使用map()
函数
var args: Array<String> = arrayOf()
args.map {
print(it)
}
还可以更简洁:
args.map(::print)
//::print 表示引用该方法
- xx.flatMap()
返回可迭代的数组,可以和xx.map()
一起使用
args.flatMap {
it.split(" ") //把字符串按照" "切割
}.map{
print("${it.toUpperCase()}")
}
文章标题:《Lambda 表达式在 kotlin 中的应用》
本文地址: https://jixiaoyong.github.io/blog/posts/53875104.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 许可协议。转载请注明出处!