Kotlin知识积累——let,with,run,apply,alse的用法

1.let

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

    //另一种用途 判断object为null的操作
    object?.let{//表示object不为null的条件下,才会去执行let函数体
        it.todo()
    }
  1. 返回值:函数块最后一行代码或者指定return表达式
  2. 适用于处理不为null的场景
  3. 函数体内指代当前对象: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
    }
  1. 返回值:函数块最后一行代码或者指定return表达式
  2. 适用场景:调用一个类的多个方法时,可以省去类名的重复,最典型应用场景是Android中的RecyclerView的onBindViewHolder方法中对UI设置数据
  3. 函数体内指定当前对象: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
    }
  1. 返回值:函数块最后一行代码或者指定return表达式
  2. 适用于let,with函数任何场景
  3. 函数体内指定当前对象: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
    }
  1. 返回值:对象本身
  2. 适用于run函数的任何场景
  3. 最典型的场景是数据model多层包裹的判空
  4. 函数体内指定当前对象: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
    }
  1. 返回值:对象本身
  2. 适用于let函数的任何场景
  3. 最典型的场景是用于多个扩展函数的调用
  4. 函数体内指定当前对象:it

在这里插入图片描述

参考资料:https://blog.csdn.net/u013064109/article/details/78786646

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值