时间:Jan 5, 2017
原文链接:https://antonioleiva.com/lambdas-kotlin/
由于Lambda表达式允许更简单的方式建模式函数,所以它是Kotlin和任何其他现代开发语言的最强工具之一。
在Java6中,我们仅能下面方法这样做:通过用单一方法声明接口,并用匿名对象实现那些接口。
Lambda表达式特别是在Kotlin中能定义的方式,为我们开启无线可能的世界。在接下来的内容中,我们将了解这些用法。
Kotlin的Lambda表达式
Lambda表达式是函数的表示的方式,在解释setOnClickListener时,我们已经见过这个例子:
val view = findViewById(R.id.welcomeMessage)
view.setOnClickListener { v -> navigateWithView(v) }
如你所见,左边定义函数(在这个例子中时view)的输入值,右边声明函数要实现的操作。
怎样定义接受Lambda表达式的函数
如果我们自己要在Kotlin中定义函数,我们就需要按如下做法:
fun setOnClickListener(listener: (view: View) -> Unit){}
由于这个函数通过参数接收一函数,或返回一函数,所以,这是一高阶函数。
Kotlin和Java interop
调用这个函数的一般方式可能是如下:
view.setOnClickListener({ v -> navigateWithView(v) })
这是我们已经见到这样做的比较简单的方法,而后续我们还能知道它帮助我们做更酷的事。
这是由于如果函数的最后一个参数是函数,我们能够将它从括号中提取出来:
view.setOnClickListener(){ v -> navigateWithView(v) }
另外,如果只有一个函数作为参数,我们还能省去括号:
view.setOnClickListener { v -> navigateWithView(v) }
DSL创建
这允许我们创建自己的DSL,这能定义微型语言。在Kotlin参考网站有HTML例子,而这里我们要定义一个更简介方法。
假设你要创建在另一个线程上运行的代码块。你可以有一个函数,它接收在后台运行的一个函数:
fun doAsync(f: () -> Unit) {
Thread({ f() }).start()
}
这个函数产生一个线程,它执行Runnable运行作为自变量接受的函数。Runnable是Java中有单一方法的类,在Kotlin中由Lambda表达式替代。
现在,在我们的代码中,产生异步代码块:
doAsync {
op1()
op2()
op3()
}
这样在{}内的每件事都将在第二个线程中执行。
内嵌函数
作为自变量接收的函数令人讨厌的是编译器需要为它们创建类,这将影响性能。但是,这可以用保留字inline容易地解决。
由于Inline函数是在编译时将它的代码替换对它的调用,所以在性能方面影响较少。为此,它不需要用额为的对象。
我们能够转换doAsync到一个inline函数:
inline fun doAsync(crossinline f: () -> Unit) {
Thread({ f() }).start()
}
在这个例子中,由于我们从另一个执行内容(另一个Lambda表达式)中调用f(),所以要求crossinline。不用太担心这些,在需要使用它时,编译器会提醒你的。
结论
如你所见,使用Lambda表达式后,我们能够简化很多我们的代码,甚至是在Java中不能实现的事。
另外,Kotlin的特别命名规则使我们能够创建属于我们自己的“开发语言”,并且还可以根据需要创建有意义的代码块。
Lambda表达式功能非常强大,这本书包含许多你能使用它们不同的情况。
Kotlin和Java interop
Kotlin的Lambda表达式以及它们怎样简化Android开发(KAD 07)的更多相关文章
-
JDK8 Lambda表达式对代码的简化
只是举个例子: public class LambdaDemo { public static String findData( String name , LambdaInterface finde ...
-
kotlin之lambda表达式和匿名函数
lambda表达式,称为匿名函数,是一种函数字面值,也就是没有声明的函数,但可以作为表达式传递出去. 函数类型: 对于接受另一个函数的作为自己的参数,必须针对这个参数指定一个函数的类型如 fun &l ...
-
butterknife简化android开发
butterknife库非常不错的依赖注入库 使用1 使用2 http://jakewharton.github.io/butterknife/ maven引入 http://www.mvnrepo ...
-
快速掌握Java中Lambda表达式的用法
Lambda表达式的作用: Lambda表达式的作用就是简化代码开发,让代码看起来更加简介.它是用来简化匿名内部类的.但是并不是所有的匿名内部类都能用Lambda表达式简化,Lambda表达式是有使用 ...
-
Lambda表达式在Kotlin中怎样工作的:setOnClickListener的转换(KAD 18)
作者:Antonio Leiva 时间:Mar 28, 2017 原文链接:https://antonioleiva.com/lambdas-kotlin-android/ 虽然,我在其它文章讲过一点 ...
-
Kotlin对象表达式要点与Lambda表达式
Kotlin对象表达式要点揭密: 在上一次https://www.cnblogs.com/webor2006/p/11352421.html中学习了Kotlin的对象表达式,它主要是解决Java中匿名 ...
-
《疯狂Kotlin讲义》读书笔记6——函数和Lambda表达式
函数和Lambda表达式 Kotlin融合了面向过程语言和面向对象语言的特征,相比于Java,它增加了对函数式编程的支持,支持定义函数.调用函数.相比于C语言,Kotlin支持局部函数(Lambda表 ...
-
Kotlin函数与Lambda表达式深入
Kotlin函数: 关于Kotlin函数在之前也一直在用,用fun来声明,回忆下: 下面再来整体对Kotlin的函数进行一个学习. 默认参数(default arguments): 先来定义一个函数: ...
-
C#,委托,匿名委托,Lambda表达式
1. 委托是什么? (1) 从数据结构来讲,委托是和类一样是一种用户自定义类型. (2) 从设计模式来讲,委托(类)提供了方法(对象)的抽象.概括的说:委托是方法的抽象. 2. 委托类型的定义: 委 ...
随机推荐
-
jsp作为服务端,ajax请求回应
刚学ajax,想以jsp作为服务端,来回应ajax的请求: 代码如下: <!DOCTYPE html> <html> <head lang="en"& ...
-
Java_ToolKit用法
转自:http://blog.sina.com.cn/s/blog_9e4556250100z5kv.html 此类是所有 Abstract Window Toolkit 实际实现的抽象超类.Tool ...
-
html基础 2
HTML 文本格式化实例 (我不知道为什么“正常显示文本”这几个字不用加标签,虽然它有在<body>标签内) <html> <body> <b>文本为黑 ...
-
Linux Programe/Dynamic Shared Library Entry/Exit Point &;&; Glibc Entry Point/Function
目录 . 引言 . C/C++运行库 . 静态Glibc && 可执行文件 入口/终止函数 . 动态Glibc && 可执行文件 入口/终止函数 . 静态Glibc & ...
-
Python之路【第十二篇】前端之js&;dome&;jQuery
JavaScript是一种属于网络的脚本语言,已经被广泛用于Web应用开发,常用来为网页添加各式各样的动态功能,为用户提供更流畅美观的浏览效果.通常JavaScript脚本是通过嵌入在HTML中来实现 ...
-
正斜杠和反斜杠-windows、web、c语言大讨论
首先,在c语言中,正斜杠/ slash 表示除法反斜杠\ backslash ,\用于转义字符,\n.\0. 其次,UNIX 操作系统设计了这种路径分隔法,它使用正斜杠:/.由于网络是首先应用在 UN ...
-
C++ 11 笔记 (四) : std::bind
std::bind 接受一个可调用的对象,一般就是函数呗.. 还是先上代码: void func(int x, int y, int z) { std::cout << "hel ...
-
同台交换机同样VLAN能够通信,不同VLAN不可通信
一.示意图 二.IP规划 PC0:192.168.0.100 255.255.255.0 PC1:192.168.0.110 255.255.255.0 PC2:192 ...
-
背水一战 Windows 10 (103) - 通知(Toast): 基础, 按计划显示 toast 通知
[源码下载] 背水一战 Windows 10 (103) - 通知(Toast): 基础, 按计划显示 toast 通知 作者:webabcd 介绍背水一战 Windows 10 之 通知(Toast ...
-
Tomcat报异常:Too many open files 的解决之路
http://www.linuxeye.com/Linux/2781.html Tomcat报 Jul 21, 2015 8:45:23 AM org.apache.tomcat.util.net.J ...