Koltin 高级篇 Lambda 简洁之道

作者 : 开心源码 本文共2281个字,预计阅读时间需要6分钟 发布时间: 2022-05-13 共192人阅读

序言

最近一直在学习 kotlin ,他给我的感觉是一门非常使用、简洁的语言。Kotlin 支持函数式编程,而 Lambda 在 Kotlin 和 Kotlin DSL 中扮演着很重要的角色,是实现整洁代码的必备语法糖。

Lambda 表达式的语法

一个 lambda 把一小段行为进行编码,你能把它当作值四处传递。它可以被独立地公告并存储到一个变量中,但是更常见的还是直接公告它井传递给函数(高阶函数)。

Kotlin in Action

Kotlin lambda 表达式始终用花括号包围。注意实参并没有用括号括起来
头把实参列表和 lambda 的函数体隔开。

高阶函数

就是这个函数可以接受另一个函数作为参数或者者返回值
函数的形参总是 首先是括号里面是函数的入参类型,而后箭头后面跟的是函数返回值类型,没有返回值要指定 Unit 如图:

Kotlin in Action

下面是一个 Android 中最常见的 view 的点击事件在 分别用 java 和 kotlin 来实现

java 写法
// java 1、首先要公告接口 2、实例这个接口创立一个匿名内部类public interface OnClickListener {    void onClick(View v);}button.setOnClickListener(new OnClickListener() {  @Override  public void onClick (View view) {  /*点击后执行的动作*/  } )
kotlin lambda 写法
// kotlin 高级函数公告( 传入 lambda )  view 类型参数 没有返回值fun setOnClickListener(listener: (View) -> Unit)// kotlin 十分简洁button.setOnClickListener({ v: View -> print(v.name)})
kotlin lambda 假如这个函数的最后一个参数是一个函数,我们可以把这个函数移动到圆括号外面
button.setOnClickListener() { v: View -> print(v.name)}
kotlin lambda 假如这个函数只有一个参数,我们可以省略这个圆括号
button.setOnClickListener{ v: View -> print(v.name)}// 用 it 代替参数button.setOnClickListener{ print(it.name)}// 假如没有用到 v 这个参数可以进一步简化button.setOnClickListener { print("我就是简洁...")}

我们将会在下一章中讲解 lambda 表达式的经典用途和集合一起工作,kotlin 是如何提供那么方便的集合库

带接收者的 lambda 和扩展函数类型

首先我们还是先通过 来看为啥要用这个带接收者的 lambda,他是怎样做到优化的。
1、先定义一个个以普通 lambda 作为参数的 buildString 函数。

/*** @param builderAction 定义函数类型的参数*/fun buildStringNormalLm(builderAction: (StringBuilder) -> Unit): String {      val sb = java.lang.StringBuilder()      // 传递一个 StringBuilder 对象作为 lambda 的参数      builderAction(sb)      return sb.toString()} //  调用普通的 lambdaval s = buildStringNormalLm {      it.append("Hello,")      it.append("World")}print(s)// 打印结果 Hello,World

2、首先 it 这个对象执行屡次操作,我们不想反复把对象的名称写出来 就是未来这个目的….
3、要做到这点,需要将 lambda 转换成带接收者的 lambda。

/*** @param builderAction 定义带接收者的函数类型的参数*  StringBuilder. () -> Unit 扩展函数公告*/fun buildStringReceiverLm(builderAction: StringBuilder. () -> Unit): String {      val sb = java.lang.StringBuilder()      // 传递一个 String Builder 实例作为 lambda 接收者      sb.builderAction()      return sb.toString()}// 调用带接收者的 lambdaval s = buildStringReceiverLm {       append("Hello,")       append("World")}print(s)// 打印结果 Hello,World

那为什么在 buildStringReceiverLm() 中可以直接调用 StringBuilder 实例那 ?

  • 主要是我们用 扩展函数类型 取代 普通函数类型 来公告参数的类型 。扩展函数类型的公告如下图:Kotlin in Action

为什么要用扩展函数类型?不需要显式的修饰符即可以访问一个外部类型的成
员让我们想起了扩展函数,它可以让我们为在代码其余地方定义的类定义自己的方法。扩展函数和带接收者的 lambda 都有一个接收者对象 ,当函数被调用的时候需要提供这个对象,它在函数体内是可用的。实际上一个个扩展函数类型形容了可以被当作扩展函数来调用的代码块。

仔细看下面的截图以及备注我想你肯定能看明白

下一节我们会通过展现 Kotlin 标准库中的 with 函数和 apply 函数,来进一步说明 带接收者的 lambda 实际项目中用到的地方。

参考资料

Kotlin之美——DSL篇
《Kotlin 实战》

说明
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是摆设,本站源码仅提供给会员学习使用!
7. 如遇到加密压缩包,请使用360解压,如遇到无法解压的请联系管理员
开心源码网 » Koltin 高级篇 Lambda 简洁之道

发表回复