Kotlin for Android (let、with、run、apply、also函数)

lambda表达式

Kotlin回调函数的lambda简化,可以参见 Kotlin系列

内联扩展函数

let

let 扩展函数的实际上是一个作用域函数。

  • 可以简化代码的写法。当然不用let也可以,使用let会使代码更简洁。
  • let函数另一个作用就是可以避免写一些判断null的操作。
//不使用let
mVideoPlayer?.setVideoView(activity.course_video_view)
mVideoPlayer?.setControllerView(activity.course_video_controller_view)
mVideoPlayer?.setCurtainView(activity.course_video_curtain_view)

//使用let,变量在内部简化为it, 为空判断也只需要在外面判断一次就好
mVideoPlayer?.let {
	   it.setVideoView(activity.course_video_view)
	   it.setControllerView(activity.course_video_controller_view)
	   it.setCurtainView(activity.course_video_curtain_view)
}

with

with要传参A,之后内部的代码,相当于在A的内部,可直接访问A的公有变量和方法。

//不使用with的代码块
override fun onBindViewHolder(holder: ViewHolder, position: Int) {

   ArticleSnippet item = getItem(position);
		if (item == null) {
			return
		}
		holder.tvNewsTitle.text = StringUtils.trimToEmpty(item.titleEn)
		holder.tvNewsSummary.text = StringUtils.trimToEmpty(item.summary))
		holder.tvExtraInfo.text = "难度:${item.gradeInfo} | 单词数:${item.length} | 读后感: ${item.numReviews}"
}

//使用with的代码, 其中访问item的方法和变量,不用item.xxx 直接写 xxx 即可 
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.text = "难度:$gradeInfo | 单词数:$length | 读后感: $numReviews"
   }
}

run

run相当于let with的综合体,

  • 相对于let,可以直接访问A的公有方法和变量,不用加it.xxx
  • 相对于with,不用传参,在外部做判空
//与上面对比,可以看出结合了let 和 with
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

用法跟run一样,唯一不同的是返回值,run返回最后一行的值,apply返回的是对象本身。

also

用法跟let一样,唯一不同的是返回值,let返回最后一行的值,alse返回的是对象本身。

参考资料

Kotlin系列之let、with、run、apply、also函数的使用

你可能感兴趣的:(Android学习)