Kotlin中的Lambda

最近在网站上看了看Lambda表达式在Kotlin中的使用,借鉴了大牛一些讲解的内容,这里简单记录了下重点内容,先看下目录

1.Lambda介绍

Lambda表达式属于函数式编程语言,区别于Java面向对象编程语言。它本质是`匿名函数,因为底层就是匿名函数实现的。

 

2.Lambda的使用

2.1Lambda表达式的特点

Lambda表达式总是被大括号包裹着,箭头前面是参数(可有可无),参数类型可以省略,箭头后面是函数体。

2.2Lambda的语法

无参:

var noParamMethod = {

    println(“无参的方法”)

}

调用 === noParamMethod()  结果 === “无参的方法”

有参:

var haveParamMethod = {s1:Int,s2:Int ->s1+s2}

调用 === haveParamMethod(1,2)  结果 === 3

lambda作为函数中的参数:

fun paramInFunction(a:Int,参数名:(参数名:参数类型,参数名:参数类型) ->表达式返回类型){

      ... ...

}

例如

fun paramFunction(a:Int,b:(num1,num2)->num1+num2):Int{

    return a+b.invoke(2,3)

}

调用 === paramInFunction(3,{num1,numb2 -> num1+numb2}) 结果 === 8

注意这里的Lambda表达式被大括号包裹着。

 

3.Lambda实践

3.1使用it

it在kotlin中不是一个关键字,它是可以作为变量名称的,例如

val it = 3

it 在当函数只有一个参数的时候可以表示这个参数,例如

fun testIt(a:Int,boolValue:((Int)->Boolean)):Int{
    return if(boolValue(a)){
        a
    }else{
        0
    }
}

调用 === testIt(10){it>3} 打印结果 === 10

调用 === testIt(2){it>3} 打印结果 === 0

3.2使用下划线(_)

Lambda可以使用下划线”_”来表示不需要处理的参数,map中用的居多,例如

map.forEach { (key, value) ->

    println("$key \t $value")

}
map.forEach { (_, value) ->

    println("$value")

}

3.3匿名函数

匿名函数与普通函数的区别就是没有函数名称

val result1 = fun(a: Int, b: Int) = a + b  匿名函数

var result2 = { a: Int, b: Int -> a + b }   Lambda表达式

匿名函数与Lambda表达式的区别有:

匿名函数的参数必须有小括号包裹,Lambda可以省略;

匿名函数在一个不带标签的return语句中,返回值是自身函数的值,

Lambda返回值是包含它的函数中返回。

3.4带接收者函数的Lambda表达式

class HTML {

    fun body() { …… }

}

fun html(init: HTML.() -> Unit): HTML {

    val html = HTML()  // 创建接收者对象

    html.init()        // 将该接收者对象传给该 lambda

    return html

}

html {       // 带接收者的 lambda 由此开始

    body()   // 调用该接收者对象的一个方法

}

3.5闭包

闭包就是函数中包含函数。

Java是面向对象编程语言,因此不支持闭包,Kotlin支持闭包。

函数返回函数,并携带状态:

fun testLambdaMethod(a:Int):()->Int{
    var b = 3
    return fun():Int{
        b++
        return a+b
    }
}
val t = testLambdaMethod(3)
println(t())
println(t())
println(t())

调用 === testLambdaMethod(3) 第一次结果 === 7 第二次结果 === 8 第三次结果 === 9

因为返回的是函数,而返回的函数还有返回值,所以这里打印的应该是t(),并且b的值也保留下来了。

引用外部变量,并改变外部变量的值:

var num: Int = 5

val list = listOf(3, 4, 5, 6, 7)

list.filter { it < 6 }.forEach { num += it }

println(num)

结果 === 17

 

4.总结

Lambda本身实质就是匿名函数实现的;

单个参数可以用it表示;

多个参数可以用_代替某个不用的参数;

闭包是函数包含函数,Java不支持闭包,Kotlin支持闭包。

 

 

 

 

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值