kotlin 回调函数、let、also、run 、with、a

2019-12-18  本文已影响0人  CODING技术小馆

kotlin lambda 简化

————————kotlin 回调函数、let、also、run 、with、apply 使用总结

Lambda 表达式(lambda expression)是一个匿名函数。编程中提到的 lambda 表达式,通常是在需要一个函数,但是又不想费神去命名一个函数的场合下使用,也就是指匿名函数。

一、回调函数

mEditText.addTextChangedListener(new TextWatcher() {
    @Override
    public void afterTextChanged(Editable editable) {
       // TODO
    }
});
mEditText?.addTextChangedListener(object : TextWatcher {
    override fun afterTextChanged(editable: Editable) {
       // TODO
    }
})
mEditText.addTextChangedListener({
   editable: Editable ->
   // TODO
})

// 如果以上代码中没有回调参数的话,可以直接把editable去掉
mEditText.addTextChangedListener({
   // TODO
})

// addTextChangedListener 函数最后一个参数是一个函数,可以直接把括号的实现提到圆括号外面
mEditText.addTextChangedListener(){
   // TODO
}

//  addTextChangedListener函数只有一个参数,可以直接省略圆括号
mEditText.addTextChangedListener{
   // TODO
}

二、内联函数 let

表示object不为null的条件下,才会去执行let函数体

// 表示object不为null的条件下,才会去执行let函数体
mEditText = findViewById<EditText>(R.id.search_et);
mEditText?.let {
    // it.todo()
    it.setSelection(0)
}

三、内联函数 also

从结构上看alsolet比较像。不同点是它们各自返回的值不一样,let函数是以闭包形式返回最后一行代码的值,如果最后一行为空就返回一个Unit类型的默认值;also函数的返回的是传入对象本身。

// 表示object不为null的条件下,才会去执行let函数体
mEditText = findViewById<EditText>(R.id.search_et).also {
    // it.todo()
    it.setSelection(0)
}

四、内联函数 with

适用于调用同一个类的多个方法时,可以省去类名重复,直接调用类的方法即可

with(object){
  //todo
}
// with函数最原始样子如下:
val result = with(user, {
       println("my name is $name, I am $age years old, my phone number is $phoneNum")
       1000
})
// 由于with函数最后一个参数是一个函数,可以把函数提到圆括号的外部,所以最终with函数的调用形式如下:
val result = with(user) {
       println("my name is $name, I am $age years old, my phone number is $phoneNum")
       1000
}
// java 写法
@Override
public void onBindViewHolder(ViewHolder holder, int position) {

    ItemBean item = getItem(position);
    if (item == null) {
        return;
    }
    holder.mTitleTv.setText(item.title);
    holder.mSubTitleTv.setText(item.subTitle);
    holder.mDescTv.setText(item.desc);
}

// kotlin 写法
override fun onBindViewHolder(holder: ViewHolder, position: Int){
   val item = getItem(position)?: return
   //
   with(item){
      holder.mTitleTv.text = title
      holder.mSubTitleTv.text = subTitle
      holder.mDescTv.text = desc
   }
}

五、内联函数 run

//  借助上边案例的代码:内联函数 with
override fun onBindViewHolder(holder: ViewHolder, position: Int){
   val item = getItem(position)?: return
   //
   with(item){
      holder.mTitleTv.text = title
      holder.mSubTitleTv.text = subTitle
      holder.mDescTv.text = desc
   }
}

// 内联函数 run
override fun onBindViewHolder(holder: ViewHolder, position: Int){
      val item = getItem(position)?: return
      item?.run{
            holder.mTitleTv.text = title
            holder.mSubTitleTv.text = subTitle
            holder.mDescTv.text = desc
            }
}

六、内联函数 apply

从结构上看applyrun比较像。不同点是它们各自返回的值不一样,run函数是以闭包形式返回最后一行代码的值;apply函数的返回的是传入对象本身。
因此apply函数 一般用于一个对象实例初始化的时候,需要对对象中的属性进行赋值;或者动态inflate出一个XML的View的时候需要给View绑定数据也会用到;

// 一个对象实例初始化的时候,需要对对象中的属性进行赋值
mEditText = findViewById<EditText>(R.id.search_et).apply { 
    // 点击事件
    setOnClickListener{
    // TODO 
    }
}

用法总结

========== THE END ==========

wx_gzh.jpg
上一篇下一篇

猜你喜欢

热点阅读