美文网首页
kotlin 之Lambda

kotlin 之Lambda

作者: star小子 | 来源:发表于2019-03-09 16:09 被阅读0次

    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大法虽好,可也要选择性使用哦!

    相关文章

      网友评论

          本文标题:kotlin 之Lambda

          本文链接:https://www.haomeiwen.com/subject/xiispqtx.html