Kotlin笔记(七)Lambda表达式
2017-06-28 本文已影响17人
小龙哥的开发日记
什么是Lambda表达式 ?
答:匿名函数 (what?没错就是匿名函数)
问:啥是匿名函数?
答:看下面(^^!!!)
表达式声明
// {[参数列表] -> [函数体,最后一行是返回值]}
// () -> Unit 无参返回值为Unit
// (Int) -> Int 传入整型,返回一个整型
我们先来看一个Kotlin里的函数
//这是一个计算两数相加的函数(看不懂那就看一下我前面的文章)
fun add(num1 : Int , num2 : Int):Int{
return num1 + num2
}
第一种简化
//匿名函数 = 后面只能跟一个表达式
var num1 = fun (arg1 : Int,arg2 : Int) = arg1 + arg2
var num2 = fun (arg1 : Int,arg2 : Int) =
if(arg1 > 10){
arg1 - arg2
}else{
arg1 + arg2
}
第二种简化
//后面可以写一个表达式或者多个
//把 )= 变成了 ->
var sum3 = {arg1 : Int , arg2 : Int ->arg1 + arg2}
//注意最后一行是返回值
var sum4 = {arg1 : Int , arg2 : Int ->
print("-----11111111111")
arg1 + arg2
}
或者
//这种写法是没有返回值的情况
var printHello = {
print("Hello")
print("bbbb")
}
或者
//suma是名称(Int,Int) -> Int先把类型和返回类型声明出来
val suma : (Int,Int) -> Int = {x,y -> x+y}
再看一个关于数组的遍历
//声明一个数组
var intArray : Array<Int> = arrayOf(1,2,3,4,5)
//遍历数组方式一
intArray.forEach { elempent -> print(elempent) }
//遍历数组方式二
intArray.forEach { print(it) }
- 我们先看第一种遍历方式:我们直接在参数里传了一个lambda表达式,我们来看一下forEach方法原码
//大家看参数是一个lambda类型
public inline fun <T> Array<out T>.forEach(action: (T) -> Unit): Unit {
for (element in this) action(element)
}
我们再来看遍历方式二
it:单个参数的隐式名称
如果函数字面值只有一个参数, 那么它的声明可以省略(连同 ->),其名称是 it。
intArray.forEach { print(it) }
这些约定可以写LINQ-风格的代码:
intArray.forEach { ele -> print(ele) }
//省略了 ele -> 因为只有一个参数
ntArray.forEach { print(it) }