Lambda表达式在Kotlin中怎样工作的:setOnClickListener的转换(KAD 18)
时间:Mar 28, 2017
原文链接:https://antonioleiva.com/lambdas-kotlin-android/
虽然,我在其它文章讲过一点Lambda表达式,我愿意更深层次解释Kotlin中Lambda表达式是怎样工作的,以及当我们用Java库时,他们是怎样以Lambda表达式的单一方法转换接口。
特别是我要给出一些例子解释怎样简化Android框架的用法,我们还将详细看到Android视图的setOnClickListener。
SetOnClickListener转换
我最喜欢Kotlin特性之一就是由于有了一些约定它简化Android框架的工作。
例如,setOnClickListener函数,在Java中时这样定义的:
public void setOnClickListener(OnClickListener l) {
...
}
而在Kotlin中我们使用它时,可以这样:
fun setOnClickListener(l: (View) -> Unit)
这节省我们必须创建接口的一个匿名实现,极大地简化了UI组件的初始化工作。
用SetOnclickListener原本方法
依照上面,我们已经节省了足够的代码了,就是我们原必须创建OnClickListener的匿名类:
view.setOnClickListener(object : View.OnClickListener {
override fun onClick(v: View?) {
toast("Hello")
}
})
不过你将看到编辑器直接给你的警告,建议你用Lambda方法。
你能够做的转换:
view.setOnClickListener({ v -> toast("Hello") })
简单,对吧?但是,这还能更进一步简化。
如果函数的最后一个参数是函数,它能够移到圆括号外面。
因此,我们能够按此提取侦听器:
view.setOnClickListener() { v -> toast("Hello") }
如果我们有多个参数,其余的参数则在圆括号内,即使这些参数是函数。仅仅最后一个参数能够提出来。
如果函数仅有一个参数,且它是一个函数,则圆括号能删除
而不是留着空的圆括号,我们最好删除这空的圆括号:
view.setOnClickListener { v -> toast("Hello") }
这就构成了代码块。在这种方法下,我们能够定义我们自己的模型语言DSL。
一个非常典型的例子是Kotlin参考页面,他们构件DSL通过代码创建HTML。
如果你不用Lambda参数,你可以删除函数的左边部分
如果你仅有一个参数这是正确。不使用视图(v),就可以删除它:
view.setOnClickListener { toast("Hello") }
另外,在函数仅接收参数,则不是在左边定义,而是用保留字it,节省一些字符。
例如,如果我们用视图传递它到另一个方法:
view.setOnClickListener { v -> doSomething(v) }
我们可以选择简单的用it:
view.setOnClickListener { doSomething(it) }
Lambda表达式,你的朋友
你见到的这些代码的不同之处是非常重要的。这不仅为你节省了字符(约70%),还极大地提高了代码的可读性。
我们只编写真正重要的代码,而跳过那些并没有多大用处的代码。
如果你想进一步学习更多这些知识,能够非常流利创建自己的Android应用程序,我建议你获取这本免费指南,学习怎样构建你的第一个项目,或直接购买这本书,学习怎样从头开始创建一个完整的应用程序。
Lambda表达式在Kotlin中怎样工作的:setOnClickListener的转换(KAD 18)的更多相关文章
- 关于lambda表达式在javascript中的使用
了解过js函数的同学应该都知道js的函数有很多种创建方式. 如: function fun(){}: var fun=function(){}: 但最近的学习中发现了lambda表达式型的创建js的匿 ...
- Lambda 表达式,Java中应用Lambda 表达式
一.Lambda 表达式 简单来说,编程中提到的 lambda 表达式,通常是在需要一个函数,但是又不想费神去命名一个函数的场合下使用,也就是指匿名函数. 链接:知乎 先举一个普通的 Python 例 ...
- 释放Android的函数式能量(I):Kotlin语言的Lambda表达式
原文标题:Unleash functional power on Android (I): Kotlin lambdas 原文链接:http://antonioleiva.com/operator-o ...
- JAVA8之lambda表达式具体解释,及stream中的lambda使用
前言: 本人也是学习lambda不久,可能有些地方描写叙述有误,还请大家谅解及指正! lambda表达式具体解释 一.问题 1.什么是lambda表达式? 2.lambda表达式用来干什么的? 3.l ...
- Kotlin——从无到有系列之高级篇(一):Lambda表达式
如果您对Kotlin很有兴趣,或者很想学好这门语言,可以关注我的掘金,或者进入我的QQ群大家一起学习.进步. 欢迎各位大佬进群共同研究.探索 QQ群号:497071402 进入正题 经过前面一系列对K ...
- Lambda表达式Contains方法(等价于SQL语句中的like)使用注意事项
貌似已经半年多没写一篇帖子了,充分的说明要么老总一天折腾的让人心齐疲惫,没心情去写:要么另外一种可能就是自己不思进取,说白了就是懒.好在这种状态在今天被打破了.MoNey加油. 众所周知,想在Enti ...
- 你知道C#中的Lambda表达式的演化过程吗?
那得从很久很久以前说起了,记得那个时候... 懵懂的记得从前有个叫委托的东西是那么的高深难懂. 委托的使用 例一: 什么是委托? 个人理解:用来传递方法的类型.(用来传递数字的类型有int.float ...
- 你知道C#中的Lambda表达式的演化过程吗
你知道C#中的Lambda表达式的演化过程吗? 阅读目录 委托的使用 匿名方法 Func和Action Lambda的诞生 那得从很久很久以前说起了,记得那个时候... 懵懂的记得从前有个叫委托的东西 ...
- Java中的Lambda表达式
Lambda来源于希腊字母入,发音为 /'læmdə/对高数有所了解的人都知道λ用于声明一个数学逻辑系统,表示根据XX的输入参数,会返回某个Y结果.这正是编程语言中函数(方法)的意思.因此Lambd ...
随机推荐
- 转载:C/C++ typedef用法
原文链接:http://www.cnblogs.com/ggjucheng/archive/2011/12/27/2303238.html 引言 typedef 声明,简称 typedef,为现有类型 ...
- js邮箱验证,身份证验证,正则表达式
邮箱验证: html部分: 邮箱验证:<input type="text" id="mail" value="" / onkeyup= ...
- 初探css3
属性选择器: 1.完全匹配的属性选择器. 就是完全匹配的字符串. [id=article]{ color:red; } 2.包含匹配选择器.包含有指定的字符串. 语法是:[attribute*=val ...
- jquery表单属性筛选元素
$(":button") 选择所有按钮元素类型为按钮的元素. 等于$('input[type="button"]') $(":checkbox&quo ...
- 【HDOJ 1269】迷宫城堡(tarjan模板题)
Problem Description 为了训练小希的方向感,Gardon建立了一座大城堡,里面有N个房间(N<=10000)和M条通道(M<=100000),每个通道都是单向的,就是说若 ...
- Delphi中CPort控件之Timeout属性
转载:http://blog.sina.com.cn/s/blog_70146dce0102wep1.html Cport的Timeout属性定义了详细的读写超时设置. 当一个特别操作的超时时间达到了 ...
- 【杂题总汇】HDU-5215 Cycle
◆HDU-5215◆ Cycle 国庆节集训的第三天……讲图论,心情愉快……刷了一堆水题,不过也刷了一些有意思的题 +传送门+ HDU ▶ 题目 给出一个无向图(无自环,无重边),求该无向图中是否存在 ...
- ubuntu安装和常用软件推荐
ubuntu安装和常用软件推荐(个人整理) 2016.08.22 17:29 13811浏览 字号 安装一套双系统,win10打游戏,ubuntu开发,win10放机械,ubuntu放固态,电脑联想i ...
- mysql根据二进制日志恢复数据/公司事故实战经验
根据二进制日志恢复 目的:恢复数据,根据二进制日志将数据恢复到今天任意时刻 增量恢复,回滚恢复 如果有备份好的数据,将备份好的数据导入新数据库时,会随着产生二进制日志 先准备一台初始化的数据库 mys ...
- Tensorflow的最佳实践
Tensorflow的最佳实践 1.变量管理 Tensorflow提供了变量管理机制,可直接通过变量的名字获取变量,无需通过传参数传递数据.方式如下: #以下为两种创建变量的方法 v=tf.get ...