当前位置: 首页 > news >正文

Kotlin 中let 、run 、with、apply、also的用法与区别

实例代码

User(val userName:String,val age:Int){fun printName(){println(userName)}fun getUserName():String{return userName}}

let 函数

let 函数常用来与对象的空判断一起用,起到作用于的限定效果。let 函数最后一行返回值。(比如实例需要let函数返回一个处理后的字符串值,则最后一行直接返回一个字符串)

val param:User? = null//let 的用法,判空
val uName = param?.let{//it//在这个闭包内部 it 指代非空的param 参数it.printName()//闭包内最后一个代码执行的结果即为返回值it.getUserName()   //返回一个字符串对象
}

run 函数

run 函数和let 函数非常相似,但是有一点不同:闭包内部不再像let函数中指定it代表对象,run 函数的闭包直接是this,可以简单理解为 run 方法扩展函数内部代用该对象的任何函数和属性就是在该对象内部调用一样,不再需要通过实例对象。看代码:

val param:User? = nullval uName= param?.run{ //this//在这个闭包内部 this 指代非空的User 对象printName()  //因为run 内部所有调用都相当于在User对象内部,所以可以不用thisthis.printName()    //闭包内最后一个代码执行的结果即为返回值this.getUserName()   //返回一个字符串对象.
}

with 函数

适用于调用同一个类的多个方法时,可以省去类名重复,直接调用类的方法即可,有点和run方法相似,但是with函数不是一个扩展函数,是一个一般函数,直接调用。返回值仍然是最后一行代码执行的结果。

val param:User? = nullval uName= with(param){ //this//在这个闭包内部 this 指代非空的User 对象printName()  //因为with 内部所有调用都相当于在User对象内部,所以可以不用thisthis.printName()    //闭包内最后一个代码执行的结果即为返回值this.getUserName()   //返回一个字符串对象.
}

apply 函数

apply 有点类似于 with 与run 的结合,但是不同的是返回值不再是代码的最后一行的结果,而是返回对象本身。

val param:User? = nullval newUser:User? = null val newUser = param?.apply{ //this//在这个闭包内部 this 指代非空的User 对象printName()  //因为apply 内部所有调用都相当于在User对象内部,所以可以不用thisthis.printName()    this.getUserName()   //这里不再返内容,而是直接返回param对象
}

also 函数

also 有点类似于let 与run 的结合,但是不同的是返回值不再是代码的最后一行的结果,而是返回对象本身,闭包内部不再是this对象而是it 

val param:User? = nullval newUser:User? = null val newUser = param?.apply{ //it//在这个闭包内部 it指代非空的param 对象it.printName()it.getUserName()   //这里不再返内容,而是直接返回param对象
}

这个方法非常类似,灵活应用即可。主要却别返回值和闭包内的作用域

http://www.lryc.cn/news/207979.html

相关文章:

  • PHP函数的定义与最简单后门原理
  • PlantSimulation访问本地Excel文件的方法
  • 使用微PE工具箱制作winU盘启动盘~重装系统
  • 漏洞复现-jquery-picture-cut 任意文件上传_(CVE-2018-9208)
  • Golang Websocket框架:实时通信的新选择
  • ExoPlayer架构详解与源码分析(7)——SampleQueue
  • 第二证券:基本面改善预期强化 机构聚焦科技成长
  • 大语言模型在天猫AI导购助理项目的实践!
  • 【STM32】GPIO控制LED(HAL库版)
  • 第27届亚洲国际动力传动与控制技术展览会盛大开幕,意大利国家展团闪耀回归
  • 永恒之蓝漏洞 ms17_010 详解
  • 汽车托运全流程介绍
  • 【API篇】八、Flink窗口函数
  • React JSX常用语法总结
  • DVWA-Cross Site Request Forgery (CSRF)
  • 浅谈安科瑞可编程电测仪表在老挝某项目的应用
  • Java项目源码合集
  • Python学习笔记--生成器
  • 【Python学习】—Python基础语法(五)
  • 【js】JavaScript清除所有(多个)定时器的方法:
  • java实现周易64卦并返回对应的卦象(含百度百科链接)
  • # 算法与程序的灵魂
  • 2023-10-21 美团2024秋招后端开发岗笔试题
  • 汽车托运是怎样收费
  • 使用docker-compose私有化部署 GitLab
  • Vue项目引入百度统计的正确操作步骤,亲测有效!
  • Keras中model.evaluate() 返回的是 loss value 和 metrics values
  • CSRF跨域请求伪造
  • LeetCode 1465. 切割后面积最大的蛋糕:纵横分别处理
  • YTM32的增强型定时器eTMR外设模块详解