kotlin 之Lambda

2019-03-09  本文已影响0人  star小子

1.Lambda表达式

(1) lambda表达式一定在一个大花括号中生存
(2) 参数在->之前,表达式在->之后(参数类型可以省略)
如:c->fun(v) 参数->表达式
具体的写法可以有以下两种写法:
//1.val sum1={ x:Int,j:Int->x+j;}
//2.val sum2:(x:Int,j:Int)->Int={
a,b->a+b
}

2.lambda 表达式灵活使用

没有使用Lambda前
View view = findViewById(R.id.textView);

view.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
viewClicked(view);
}
});

使用了Lambda之后
View view = findViewById(R.id.textView);
view.setOnClickListener{
//大括号体内才是正真的lambda表达式
view->viewClicked(view)
}

如果没有接触过Lambdab咋看一眼估计都是这个表情

what.png

让我们来剖析一下view.setOnClickListener { v -> imageClicked(v) }这个表达式是如何一步一步演化而来的。

(1)让我们先写一个完整的lambda表达式
val imageClick:(v:View)->Unit={
v->viewClicked(v)
}

申明一个函数变量 imageClick,并指向一个Lambda函数{v->viewClicked(v)}
然后在Lambda表达式中调用viewClicked(v:View?)方法
然后调用此方法

lambda表达式可以传递给一个高阶函数当作参数
view.setOnClickListener(imageClick)
就立马可以演变成为
view.setOnClickListener({
v->viewClick(v)
})
并且Kolin中有一个规定,如果函数表达式的最后一个参数是一个函数,并且传递的是一个lambda表达式来作为参数
那么lambda表达式可以提取到圆括号外面。
view.setOnClickListener(){
v->viewClick(v)
}
同时还规定如果一个函数的参数只有一个,且参数也是一个函数,那么可以省略最左侧的圆括号:
所以就有了
view.setOnClickListener{
v->viewClick(v)

这样子的精妙写法。

3.why use Lambda

然后我们可以思考一下java已经有匿名内部类了为什么我们还要学Lambda来实现呢?

通过之前的例子,我们已经可以很好地看出来使用Lambda表达式可以一方面简化我们的代码逻辑,尤其是匿名内部类的"回调地狱嵌套"
最重要的一点就是Lambda表达式可以避免在抽象类或者接口中编写明确的函数式声明。同时也避免了类的实现部分,省去了OnClickListener接口这一环节

tips:Lambda大法虽好,但是也不是任何地方都能够使用哦!
使用Lambda表达式的前提就是此接口必须只有一个抽象方法需要实现,多余一个抽象方法时不能使用Lambda表达式。所以Lambda大法虽好,可也要选择性使用哦!

上一篇下一篇

猜你喜欢

热点阅读