kotlin学习笔记——Lambda表达式


最近在学郭神的《第三行代码》,大部分内容出自于此,另外加上我自己的一些总结和体会,记此学习笔记,若有歧义,欢迎指出,一起学习进步!

本篇内容主要介绍了Lambda表达式的用法和Kotlin中常用的简化规则,提升代码阅读能力,理解之后就能明白,为什么kotlin大神的代码可以如此优雅

定义

直白的说,Lambda就是一小段可以作为参数传递的代码。

一般向某个函数传参都只能是变量,而Lambda可以传一段代码。
类似python中的map、reduce函数,允许传入Lambda表达式,ketlin的集合中也有很多类似的函数式API ,如map() filter() maxByOrNull()等( 书中的maxBy() 已被弃用)
虽然kotlin对传入的代码长度没有限制,但是太长可能会影响代码的可读性。

基本用法

如下,在集合中找到长度最长的单词

val list = listOf("Hello", "world", "I", "am", "kotlin")
val lambda = { word: String -> word.length }
val maxLengthWord = list.maxByOrNull(lambda)    //maxByOrNull传入一小段代码
println("max length word is $maxLengthWord")

简化用法

我们可以将上面的代码简化处理,就得到如下:

val list = listOf("Hello", "world", "I", "am", "kotlin")
val maxLengthWord = list.maxByOrNull { it.length }	// maxByOrNull传入的就是一个简化的Lambda表达式
println("max length word is $maxLengthWord")

是不是省了很多代码,也优雅很多

简化规则

下面我们逐步进行简化,来方便理解kotlin的作为函数式语言的精髓

规则一

可以不需要专门定义lambda,可以将其直接传入,如下:

val maxLengthWord = list.maxByOrNull({ word: String -> word.length })

规则二

kotlin中,当Lambda参数是函数的最后一个参数时,可以将Lambda表达式移到函数括号( )的后面,如下:

val maxLengthWord = list.maxByOrNull() { word: String -> word.length }

规则三

kotlin中,如果Lambda参数是函数的唯一参数的话,可以将函数括号( )省略,如下:

val maxLengthWord = list.maxByOrNull { word: String -> word.length }

规则四

kotlin拥有出色的类型推导机制,因此可以省略参数类型声明,如下:

val maxLengthWord = list.maxByOrNull { word -> word.length }

规则五

当Lambda表达式的参数列表中只有一个参数时,可以省略声明参数名,直接用 it 关键字代替,就得到了上面的最终简化版本,如下:

val maxLengthWord = list.maxByOrNull { it.length }

举一反三

上述的简化规则在使用Kotlin时可以灵活运用
例如Android中最常用的设置点击监听,本来完整代码应该如下:

widgetBtnF2nmczuc.setOnClickListener(object : View.OnClickListener {
      override fun onClick(p0: View?) {
            Log.d(TAG, p0.toString())
        }
    })

上述代码可以使用Lambda表达式来简化

规则六

kotlin中,需要实现某个抽象类的时候,若该抽象类只有一个抽象方法需要重写,则可以用Lambda直接传入该方法的实现代码,java 1.8以后也支持如此,如下:

widgetBtnF2nmczuc.setOnClickListener({ p0 -> Log.d(TAG, p0.toString()) })

看到这里,是不是同上面 规则一 的时候一样了,再进行二、三、四、五的简化,就得到了如下代码:

widgetBtnF2nmczuc.setOnClickListener { Log.d(TAG, it.toString()) }

总结

kotlin的Lambda表达式和标准函数搭配起来灵活运用,可以帮助我们减少很多不必要的代码,编程变得如此优雅。
需要注意的是,以上规则的运用条件要清楚,不满足条件的时候可不能简化噢。例如 规则六 中,抽象类的抽象方法只有一个时,才能简化成Lambda表达式, 规则五 中,Lambda参数只有一个时才能省略并用 it 关键字来代替他的参数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值