1.let
object.let{
it.todo()//在函数体内使用it替代object对象去访问其公有的属性和方法
...
}
//另一种用途 判断object为null的操作
object?.let{//表示object不为null的条件下,才会去执行let函数体
it.todo()
}
- 返回值:函数块最后一行代码或者指定return表达式
- 适用于处理不为null的场景
- 函数体内指代当前对象:it
没有使用let的代码是这样的:
mCustomTextView?.setText("i am chinese")
mCustomTextView?.setTextSize(16)
mCustomTextView?.setTextColor("#FFFFFF")
使用了let后是这样的:
mCustomTextView?.let{
it?.setText("i am chinese")
it?.setTextSize(16)
it?.setTextColor("#FFFFFF")
}
代码优雅很多吧?
2.with
with(object){
//todo
}
- 返回值:函数块最后一行代码或者指定return表达式
- 适用场景:调用一个类的多个方法时,可以省去类名的重复,最典型应用场景是Android中的RecyclerView的onBindViewHolder方法中对UI设置数据
- 函数体内指定当前对象:this
没有使用with的代码是这样的:
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
User item = getItem(position);
if (item == null) {
return;
}
holder.tvName.setText(StringUtils.trimToEmpty(item.name));
holder.tvAge.setText(StringUtils.trimToEmpty(item.age));
holder.tvExtraInfo.setText(item.extraInfo);
}
使用了with的代码是:
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
val item = getItem(position)?: return
with(item) {
holder.tvName.setText(name);
holder.tvAge.setText(age);
holder.tvExtraInfo.setText(extraInfo);
}
}
是不是清爽了不少?
3.run
object.run{
//todo
}
- 返回值:函数块最后一行代码或者指定return表达式
- 适用于let,with函数任何场景
- 函数体内指定当前对象:this
还是使用上面的例子:
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
getItem(position)?.run {
holder.tvName.setText(name);
holder.tvAge.setText(age);
holder.tvExtraInfo.setText(extraInfo);
}
}
是不是简介了不少?
4.apply
object.apply{
//todo
}
- 返回值:对象本身
- 适用于run函数的任何场景
- 最典型的场景是数据model多层包裹的判空
- 函数体内指定当前对象:this
使用apply之前是这样的:
if (DataLayer1 == null || DataLayer1.dataLayer2a == null || DataLayer1.dataLayer2b == null) {
return;
}
if (DataLayer1.dataLayer2a.dataLayer3 != null) {
func1();
return;
}
if (DataLayer1.dataLayer2b != null && !DataLayer1.dataLayer2b.dataLayer3.isEmpty()) {
func2();
return;
}
}
使用apply之后是这样的:
DataLayer1?.apply{
//DataLayer1不为空的时候操作DataLayer1
}?.dataLayer2a?.apply{
//dataLayer2a不为空的时候操作dataLayer2a
}?.dataLayer2b?.apply{
//dataLayer2b不为空的时候操作dataLayer2b
}?.dataLayer3?.apply{
//dataLayer3不为空的时候操作dataLayer3
}
5.also
object.also{
//todo
}
- 返回值:对象本身
- 适用于let函数的任何场景
- 最典型的场景是用于多个扩展函数的调用
- 函数体内指定当前对象:it
参考资料:https://blog.csdn.net/u013064109/article/details/78786646