Kotlin

Kotlin作用域函数let、with、run、apply、al

2023-06-18  本文已影响0人  GameProgramer

Kotlin标准库中的letwithrunapplyalso这五个函数相当有意思。它们的实现非常简单,区区两三行,却直击了Java的若干痛点。
Kotlin对它们的定位是scope functions。这是什么意思呢?
我理解scope functions是指这些函数可以通过新的作用域操作对象,避免引入临时变量或一次性函数污染原作用域。
下面简要分析下这几个函数。

let

函数结构
object.let{
   //在函数体内使用it替代object对象去访问其公有的属性和方法
   it.todo()
   ...
}

//另一种用途 判断object为null的操作
//表示object不为null的条件下,才会去执行let函数体
object?.let{
   it.todo()
}
适用的场景
例子
mTextView?.textSize(...)
mTextView?.setTextColor(...)
mTextView?.background(..)
mTextView?.let{
        it.textSize(...)
        it.setTextColor(...)
        it.background(..)
}
特点

with

函数结构
 with(object){
   //todo
 }
适用的场景
例子
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
         itemView.shop_tv_edit.setOnClickListener(listener)
         itemView.shop_tv_insert.setOnClickListener(listener)
         itemView.shop_tv_show.setOnClickListener(listener)
         itemView.shop_tv_hide.setOnClickListener(listener)
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
        with(itemView) {
            shop_tv_edit.setOnClickListener(listener)
            shop_tv_insert.setOnClickListener(listener)
            shop_tv_show.setOnClickListener(listener)
            shop_tv_hide.setOnClickListener(listener)
        }
}
特点

run

函数结构
object.run{
//todo
}
适用的场景
例子
override fun onBindViewHolder(holder: ViewHolder, position: Int){
   val item = getItem(position)?: return
   
   with(item){
     holder.tvNewsTitle.text = StringUtils.trimToEmpty(titleEn)
       holder.tvNewsSummary.text = StringUtils.trimToEmpty(summary)
       holder.tvExtraInf = "难度:$gradeInfo | 单词数:$length | 读后感: $numReviews" 
   
   }
}
override fun onBindViewHolder(holder: ViewHolder, position: Int){
   
  getItem(position)?.run{
      holder.tvNewsTitle.text = StringUtils.trimToEmpty(titleEn)
       holder.tvNewsSummary.text = StringUtils.trimToEmpty(summary)
       holder.tvExtraInf = "难度:$gradeInfo | 单词数:$length | 读后感: $numReviews"
   }
}
特点

apply

函数结构
object.apply{
//todo
}
适用的场景
例子
val wgDialog = WGDialog(this@ShopStuffActivity)
    wgDialog.message = "该页面尚未保存,是否返回?"
    wgDialog.btnLeft = "取消"
    wgDialog.btnRight = "确定"
    wgDialog.addListener(WGDialog.Item.RIGHT, object:   WGDialogInterface.OnClickListener{
          override fun onButtonClick(which: Int, isCheck: Boolean) {
               finish()
          }
    })
    wgDialog.show()
WGDialog(this@ShopStuffActivity).apply {
   message = "该页面尚未保存,是否返回?"
   btnLeft = "取消"
   btnRight = "确定"
   addListener(WGDialog.Item.RIGHT, object: WGDialogInterface.OnClickListener{
          override fun onButtonClick(which: Int, isCheck: Boolean) {
                  finish()
          }
     })
  }.show()
特点

also

函数结构
object.also{
//todo
}
适用的场景
例子
mTextView?.textSize(...)
mTextView?.setTextColor(...)
mTextView?.background(..)
mTextView?.also{
        it.textSize(...)
        it.setTextColor(...)
        it.background(..)
}
特点

总结

函数名 函数体内使用的对象 返回值
let it 函数块的最后一行或指定return表达式
with this或省略 函数块的最后一行或指定return表达式
run this或省略 函数块的最后一行或指定return表达式
apply this或省略 this
also it this
上一篇 下一篇

猜你喜欢

热点阅读