作者:Antonio Leiva

时间:Jan 5, 2017

原文链接:https://antonioleiva.com/lambdas-kotlin/

由于Lambda表达式允许更简单的方式建模式函数,所以它是Kotlin和任何其他现代开发语言的最强工具之一。

在Java6中,我们仅能下面方法这样做:通过用单一方法声明接口,并用匿名对象实现那些接口。

Lambda表达式特别是在Kotlin中能定义的方式,为我们开启无线可能的世界。在接下来的内容中,我们将了解这些用法。

Kotlin的Lambda表达式

Lambda表达式是函数的表示的方式,在解释setOnClickListener时,我们已经见过这个例子:

1 val view = findViewById(R.id.welcomeMessage)
2 view.setOnClickListener { v -> navigateWithView(v) }

如你所见,左边定义函数(在这个例子中时view)的输入值,右边声明函数要实现的操作。

怎样定义接受Lambda表达式的函数

如果我们自己要在Kotlin中定义函数,我们就需要按如下做法:

1 fun setOnClickListener(listener: (view: View) -> Unit){}

由于这个函数通过参数接收一函数,或返回一函数,所以,这是一高阶函数

Kotlin和Java interop

调用这个函数的一般方式可能是如下:

1 view.setOnClickListener({ v -> navigateWithView(v) })

这是我们已经见到这样做的比较简单的方法,而后续我们还能知道它帮助我们做更酷的事。

这是由于如果函数的最后一个参数是函数,我们能够将它从括号中提取出来:

1 view.setOnClickListener(){ v -> navigateWithView(v) }

另外,如果只有一个函数作为参数,我们还能省去括号:

1 view.setOnClickListener { v -> navigateWithView(v) }

DSL创建

这允许我们创建自己的DSL,这能定义微型语言。在Kotlin参考网站有HTML例子,而这里我们要定义一个更简介方法。

假设你要创建在另一个线程上运行的代码块。你可以有一个函数,它接收在后台运行的一个函数:

1 fun doAsync(f: () -> Unit) {
2     Thread({ f() }).start()
3 }

这个函数产生一个线程,它执行Runnable运行作为自变量接受的函数。Runnable是Java中有单一方法的类,在Kotlin中由Lambda表达式替代。

现在,在我们的代码中,产生异步代码块:

1 doAsync {
2     op1()
3     op2()
4     op3()
5 }

这样在{}内的每件事都将在第二个线程中执行。

内嵌函数

作为自变量接收的函数令人讨厌的是编译器需要为它们创建类,这将影响性能。但是,这可以用保留字inline容易地解决。

由于Inline函数是在编译时将它的代码替换对它的调用,所以在性能方面影响较少。为此,它不需要用额为的对象。

我们能够转换doAsync到一个inline函数:

1 inline fun doAsync(crossinline f: () -> Unit) {
2     Thread({ f() }).start()
3 }

在这个例子中,由于我们从另一个执行内容(另一个Lambda表达式)中调用f(),所以要求crossinline。不用太担心这些,在需要使用它时,编译器会提醒你的。

结论

如你所见,使用Lambda表达式后,我们能够简化很多我们的代码,甚至是在Java中不能实现的事。

另外,Kotlin的特别命名规则使我们能够创建属于我们自己的“开发语言”,并且还可以根据需要创建有意义的代码块。

Lambda表达式功能非常强大,这本书包含许多你能使用它们不同的情况。

Kotlin和Java interop

转载于:https://www.cnblogs.com/figozhg/p/6257656.html

Kotlin的Lambda表达式以及它们怎样简化Android开发(KAD 07)相关推荐

  1. 【Kotlin】Lambda 表达式 ( 简介 | 表达式语法 | 表达式类型 | 表达式返回值 | 调用方式 | 完整示例 )

    文章目录 I . Lambda 表达式 简介 II . Lambda 表达式语法 III . Lambda 表达式类型 IV . Lambda 表达式返回值 V . Lambda 表达式调用 VI . ...

  2. kotlin 中 lambda 表达式的 return 行为

    kotlin 带来了许多新的语法(糖?),同时也带来了许多懵逼的地方,看 <kotlin 实战>一书时就被各种 return 的行为搞懵逼了. 在 lambda 表达式中,如果没有显式的 ...

  3. Ktx:简化Android开发的Kotlin库

    JCenter android implementation 'com.ayvytr:ktx:3.0.0' androidx implementation 'com.ayvytr:ktx-androi ...

  4. Kotlin系列之Lambda表达式(1)

    今天开始后续的几篇Kotlin的文章会介绍Kotlin中Lambda表达式相关的内容. 什么是Lambda表达式 在Java8中引入了Lambda表达式,这是最令Java开发者激动和期待的一个功能.那 ...

  5. Kotlin-Android世界的一股清流-Lambda表达式

    (转载) 源码地址:https://github.com/cn-ljb/KotlinBlogs 什么是Lambda表达式 在函数的篇章里我们知道了Lambda表达式就是函数,并且也进行了证明. 这篇文 ...

  6. 1.22 Lambda表达式的3种简写方式

    使用 Lambda 表达式是为了简化程序代码,Lambda 表达式本身也提供了多种简化形式,这些简化形式虽然简化了代码,但客观上使得代码可读性变差.本节介绍 Lambda 表达式的几种简化形式. 省略 ...

  7. Java8 之 lambda 表达式、方法引用、函数式接口、默认方式、静态方法

    今天我来聊聊 Java8 的一些新的特性,确实 Java8 的新特性的出现,给开发者带来了非常大的便利,可能刚刚开始的时候会有点不习惯的这种写法,但是,当你真正的熟悉了之后,你一定会爱上这些新的特性的 ...

  8. 【Java10】lambda表达式(函数式编程),Stream流,File类,字节/字符流,乱码,缓冲/转换/序列化/打印流,Properties

    文章目录 1.lambda表达式标准语法:()->{} 2.lambda表达式简略语法:可推导即可省略 3.lambda表达式原理:lambda效率比匿名内部类高 4.两个函数式接口:Consu ...

  9. JAVA8之lambda表达式

    lambda表达式是java8开始支持的一个特性,方便好用,使用lambda表达式进行编程可以明显提升开发效率,并且在执行效率上也有一定的优化.下面回顾一下lambda表达式的两部分常见用途. 一.针 ...

最新文章

  1. 一文运维zookeeper
  2. Android Paint
  3. python自己写包_Python将自己写的模块进行打包
  4. Hadoop日记Day7---HDFS的WED端口
  5. View.setSystemUiVisibility(int) 方法使用
  6. python2和python3如何共存,如何安装多版本python python2和python3共存以及pip共存
  7. Ubuntu服务器安装snmpd(用于监控宝)
  8. (转)OS X Mountain Lion 系统配置 Apache+Mysql+PHP 详细教程
  9. 虚拟机VMware的Ubuntu下安装tensorflow详解
  10. 真正的程序员(转贴)
  11. axure购物车加减实现
  12. linux系统怎么启动u盘启动盘,如何制作 linux 系统 U盘启动盘
  13. matlab-画折线图
  14. 计算机控制系统在电厂的应用,计算机控制系统在电厂中的应用.doc
  15. 安卓view.getMeasuredHeight()得到的高度单位以及dp和px的转换
  16. Flutter生命周期
  17. 春考天津计算机知识点资料,2016年天津春季高考计算机基础考试大纲
  18. 手机显示器云服务器,不想买台式机,手机加显示器组成云电脑是否可行?
  19. 被言情小说泡大的人工智能,随便写几行字都是情诗
  20. python3 判断字符串是否包含中英文和数字

热门文章

  1. python下载显示文件丢失_Microsoft.PythonTools.resources.dll
  2. php 数组对比 unset,如何区分PHP中unset,array_splice的区别
  3. android 弹出弹框2秒消失_基于HTML5 Canvas 实现弹出框
  4. 运行 java classnotfound_JAR运行出现ClassNotFoundException异常的解决办法
  5. 联想计算机CDROM启动,联想电脑光驱启动问题?
  6. python概率密度函数参数估计_EM算法求高斯混合模型参数估计——Python实现
  7. java math 类_Java Math类静态长轮(double d)示例
  8. css degrees_带有Python示例的math.degrees()方法
  9. JAVA和javascrito_JAVA 和JavaScript的split方法异同
  10. rstudio 修改代码间距_第一章 R和RStudio