美文网首页Kotlin学习笔记
kotlin学习笔记——lambda表达式

kotlin学习笔记——lambda表达式

作者: chzphoenix | 来源:发表于2017-09-27 14:33 被阅读57次

    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表达式

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