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

时间:2022-09-21 11:24:04

作者:Antonio Leiva

时间:Jan 5, 2017

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

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

由于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)的更多相关文章

  1. JDK8 Lambda表达式对代码的简化

    只是举个例子: public class LambdaDemo { public static String findData( String name , LambdaInterface finde ...

  2. kotlin之lambda表达式和匿名函数

    lambda表达式,称为匿名函数,是一种函数字面值,也就是没有声明的函数,但可以作为表达式传递出去. 函数类型: 对于接受另一个函数的作为自己的参数,必须针对这个参数指定一个函数的类型如 fun &l ...

  3. butterknife简化android开发

    butterknife库非常不错的依赖注入库 使用1  使用2 http://jakewharton.github.io/butterknife/ maven引入 http://www.mvnrepo ...

  4. 快速掌握Java中Lambda表达式的用法

    Lambda表达式的作用: Lambda表达式的作用就是简化代码开发,让代码看起来更加简介.它是用来简化匿名内部类的.但是并不是所有的匿名内部类都能用Lambda表达式简化,Lambda表达式是有使用 ...

  5. Lambda表达式在Kotlin中怎样工作的:setOnClickListener的转换(KAD 18)

    作者:Antonio Leiva 时间:Mar 28, 2017 原文链接:https://antonioleiva.com/lambdas-kotlin-android/ 虽然,我在其它文章讲过一点 ...

  6. Kotlin对象表达式要点与Lambda表达式

    Kotlin对象表达式要点揭密: 在上一次https://www.cnblogs.com/webor2006/p/11352421.html中学习了Kotlin的对象表达式,它主要是解决Java中匿名 ...

  7. 《疯狂Kotlin讲义》读书笔记6——函数和Lambda表达式

    函数和Lambda表达式 Kotlin融合了面向过程语言和面向对象语言的特征,相比于Java,它增加了对函数式编程的支持,支持定义函数.调用函数.相比于C语言,Kotlin支持局部函数(Lambda表 ...

  8. Kotlin函数与Lambda表达式深入

    Kotlin函数: 关于Kotlin函数在之前也一直在用,用fun来声明,回忆下: 下面再来整体对Kotlin的函数进行一个学习. 默认参数(default arguments): 先来定义一个函数: ...

  9. C#,委托,匿名委托,Lambda表达式

    1. 委托是什么? (1) 从数据结构来讲,委托是和类一样是一种用户自定义类型.  (2) 从设计模式来讲,委托(类)提供了方法(对象)的抽象.概括的说:委托是方法的抽象. 2. 委托类型的定义: 委 ...

随机推荐

  1. jsp作为服务端,ajax请求回应

    刚学ajax,想以jsp作为服务端,来回应ajax的请求: 代码如下: <!DOCTYPE html> <html> <head lang="en"& ...

  2. Java&lowbar;ToolKit用法

    转自:http://blog.sina.com.cn/s/blog_9e4556250100z5kv.html 此类是所有 Abstract Window Toolkit 实际实现的抽象超类.Tool ...

  3. html基础 2

    HTML 文本格式化实例 (我不知道为什么“正常显示文本”这几个字不用加标签,虽然它有在<body>标签内) <html> <body> <b>文本为黑 ...

  4. Linux Programe&sol;Dynamic Shared Library Entry&sol;Exit Point &amp&semi;&amp&semi; Glibc Entry Point&sol;Function

    目录 . 引言 . C/C++运行库 . 静态Glibc && 可执行文件 入口/终止函数 . 动态Glibc && 可执行文件 入口/终止函数 . 静态Glibc & ...

  5. Python之路【第十二篇】前端之js&amp&semi;dome&amp&semi;jQuery

    JavaScript是一种属于网络的脚本语言,已经被广泛用于Web应用开发,常用来为网页添加各式各样的动态功能,为用户提供更流畅美观的浏览效果.通常JavaScript脚本是通过嵌入在HTML中来实现 ...

  6. 正斜杠和反斜杠-windows、web、c语言大讨论

    首先,在c语言中,正斜杠/ slash 表示除法反斜杠\ backslash ,\用于转义字符,\n.\0. 其次,UNIX 操作系统设计了这种路径分隔法,它使用正斜杠:/.由于网络是首先应用在 UN ...

  7. C&plus;&plus; 11 笔记 (四) : std&colon;&colon;bind

    std::bind 接受一个可调用的对象,一般就是函数呗.. 还是先上代码: void func(int x, int y, int z) { std::cout << "hel ...

  8. 同台交换机同样VLAN能够通信,不同VLAN不可通信

    一.示意图 二.IP规划 PC0:192.168.0.100  255.255.255.0        PC1:192.168.0.110  255.255.255.0        PC2:192 ...

  9. 背水一战 Windows 10 &lpar;103&rpar; - 通知(Toast)&colon; 基础&comma; 按计划显示 toast 通知

    [源码下载] 背水一战 Windows 10 (103) - 通知(Toast): 基础, 按计划显示 toast 通知 作者:webabcd 介绍背水一战 Windows 10 之 通知(Toast ...

  10. 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 ...