kotlin学习笔记——lambda表达式

Kotlin学习笔记系列:http://blog.csdn.net/column/details/16696.html

先简单说说lambda表达式:
(Type a, Type b, ...) -> {...}
左边是参数(参数类型可省略),如果只有一个参数括号也可以省略,右边是函数体和返回结果(大括号可省略)。
如:

int add(int a, int b){   
     return a + b;  
}  

可以写成 (a, b) -> a+b

以click为例,在kotlin中,匿名内部类可以:

view.setOnClickListener(object: OnClickListener{  
     override fun onClick(view: View){  
          toast("test")  
     }  
})  

通过lambda简化为
(在kotlin中如果一个Interface包单个函数可以被替代为一个函数)
view.setOnClickListener({view -> toast("test")}) //用大括号将lambda匿名函数包围

如果左边的参数没有使用,也可以省略
view.setOnClickListener({ toast("test") })

如果函数的最后一个参数是一个函数,可以放在括号后面
view.setOnClickListener() { toast("test") }

如果函数只有一个参数,可以省略括号
view.setOnClickListener{ toast("test") }

1、it引用
另外一种情况当左边的参数被使用时,且函数只有这一个参数,如
view.setOnClickListener({ view -> toast(view.tag.toString()) })
这时候可以用it引用来代替这个参数,可直接简化为
view.setOnClickListener{ toast(it.tag.toString()) }

2、lambda匿名函数声明
var obj: (Type, Type, ...) -> Type
左边是参数类型,可以有多个但是括号不能省略。右边是返回类型,如果是空则是Unit。如:

setListener(var item: Item, var listener: (Item) -> Unit){  
     view.setOnClickListener{ listener(item) }  
}  

注意:在这里应该是view.setOnClickListener{ view -> { listener(item) } },是在OnClickLisrener的OnClick函数中执行lisrener(item)的,但是由于view未使用所以可以继续简化成上面的样子*
使用时:
setListener(item) { toast(it.name) }
注意:如果没有参数则 var obj: () -> Type,使用时不要传入参数,但是括号不能省略,如view.setOnClickListener{ listener()}

3、lambda函数不执行
使用匿名函数时一定要有括号,没有括号也不会报错,但是这个函数不会执行,如

setListener(var item: Item, var listener: (Item) -> Unit){  
     view.setOnClickListener{ listener }  
}  

并不会报错,但是点击后不执行函数,一定要带上括号和参数,如view.setOnClickListener{ listener(item) }

你可能感兴趣的:(kotlin学习笔记——lambda表达式)