Kotlin的Lambda表达式以及它们怎样简化Android开发(KAD 07)
作者: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)相关推荐
- 【Kotlin】Lambda 表达式 ( 简介 | 表达式语法 | 表达式类型 | 表达式返回值 | 调用方式 | 完整示例 )
文章目录 I . Lambda 表达式 简介 II . Lambda 表达式语法 III . Lambda 表达式类型 IV . Lambda 表达式返回值 V . Lambda 表达式调用 VI . ...
- kotlin 中 lambda 表达式的 return 行为
kotlin 带来了许多新的语法(糖?),同时也带来了许多懵逼的地方,看 <kotlin 实战>一书时就被各种 return 的行为搞懵逼了. 在 lambda 表达式中,如果没有显式的 ...
- Ktx:简化Android开发的Kotlin库
JCenter android implementation 'com.ayvytr:ktx:3.0.0' androidx implementation 'com.ayvytr:ktx-androi ...
- Kotlin系列之Lambda表达式(1)
今天开始后续的几篇Kotlin的文章会介绍Kotlin中Lambda表达式相关的内容. 什么是Lambda表达式 在Java8中引入了Lambda表达式,这是最令Java开发者激动和期待的一个功能.那 ...
- Kotlin-Android世界的一股清流-Lambda表达式
(转载) 源码地址:https://github.com/cn-ljb/KotlinBlogs 什么是Lambda表达式 在函数的篇章里我们知道了Lambda表达式就是函数,并且也进行了证明. 这篇文 ...
- 1.22 Lambda表达式的3种简写方式
使用 Lambda 表达式是为了简化程序代码,Lambda 表达式本身也提供了多种简化形式,这些简化形式虽然简化了代码,但客观上使得代码可读性变差.本节介绍 Lambda 表达式的几种简化形式. 省略 ...
- Java8 之 lambda 表达式、方法引用、函数式接口、默认方式、静态方法
今天我来聊聊 Java8 的一些新的特性,确实 Java8 的新特性的出现,给开发者带来了非常大的便利,可能刚刚开始的时候会有点不习惯的这种写法,但是,当你真正的熟悉了之后,你一定会爱上这些新的特性的 ...
- 【Java10】lambda表达式(函数式编程),Stream流,File类,字节/字符流,乱码,缓冲/转换/序列化/打印流,Properties
文章目录 1.lambda表达式标准语法:()->{} 2.lambda表达式简略语法:可推导即可省略 3.lambda表达式原理:lambda效率比匿名内部类高 4.两个函数式接口:Consu ...
- JAVA8之lambda表达式
lambda表达式是java8开始支持的一个特性,方便好用,使用lambda表达式进行编程可以明显提升开发效率,并且在执行效率上也有一定的优化.下面回顾一下lambda表达式的两部分常见用途. 一.针 ...
最新文章
- 一文运维zookeeper
- Android Paint
- python自己写包_Python将自己写的模块进行打包
- Hadoop日记Day7---HDFS的WED端口
- View.setSystemUiVisibility(int) 方法使用
- python2和python3如何共存,如何安装多版本python python2和python3共存以及pip共存
- Ubuntu服务器安装snmpd(用于监控宝)
- (转)OS X Mountain Lion 系统配置 Apache+Mysql+PHP 详细教程
- 虚拟机VMware的Ubuntu下安装tensorflow详解
- 真正的程序员(转贴)
- axure购物车加减实现
- linux系统怎么启动u盘启动盘,如何制作 linux 系统 U盘启动盘
- matlab-画折线图
- 计算机控制系统在电厂的应用,计算机控制系统在电厂中的应用.doc
- 安卓view.getMeasuredHeight()得到的高度单位以及dp和px的转换
- Flutter生命周期
- 春考天津计算机知识点资料,2016年天津春季高考计算机基础考试大纲
- 手机显示器云服务器,不想买台式机,手机加显示器组成云电脑是否可行?
- 被言情小说泡大的人工智能,随便写几行字都是情诗
- python3 判断字符串是否包含中英文和数字
热门文章
- python下载显示文件丢失_Microsoft.PythonTools.resources.dll
- php 数组对比 unset,如何区分PHP中unset,array_splice的区别
- android 弹出弹框2秒消失_基于HTML5 Canvas 实现弹出框
- 运行 java classnotfound_JAR运行出现ClassNotFoundException异常的解决办法
- 联想计算机CDROM启动,联想电脑光驱启动问题?
- python概率密度函数参数估计_EM算法求高斯混合模型参数估计——Python实现
- java math 类_Java Math类静态长轮(double d)示例
- css degrees_带有Python示例的math.degrees()方法
- JAVA和javascrito_JAVA 和JavaScript的split方法异同
- rstudio 修改代码间距_第一章 R和RStudio