跳至主要內容

Lambda 表达式在 kotlin 中的应用

JI,XIAOYONG...大约 2 分钟

一个例子

普通写法

  1. 定义一个接口 OnClickListener
interface ClickListener{
    fun onClick(view: View)
}
  1. 定义方法 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 主体中的最后一个(或可能是单个)表达式会视为返回值。

kotlincn.netopen in new window 高阶函数和 lambda 表达式open in new window

使用 lambda 的形式如下() -> {},()内是参数,{}是函数具体的行为。

//Java 8 方式:
new Thread( () -> System.out.println("In Java8, Lambda expression rocks !!") ).start();

这个例子来自 importNew.comopen in new window,Java8 lambda 表达式 10 个示例open in new window

小知识点

  • 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 中的应用》
本文作者: JI,XIAOYONG
发布时间: 2018/02/09 11:09:06 UTC+8
更新时间: 2023/12/30 16:17:02 UTC+8
written by human, not by AI
本文地址: https://jixiaoyong.github.io/blog/posts/53875104.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 许可协议。转载请注明出处!
你认为这篇文章怎么样?
  • 0
  • 0
  • 0
  • 0
  • 0
  • 0
评论
  • 按正序
  • 按倒序
  • 按热度
Powered by Waline v2.15.8