首页 > 其他分享 >Kotlin 标准函数 with、run、apply 的定义和使用

Kotlin 标准函数 with、run、apply 的定义和使用

时间:2024-05-29 22:32:45浏览次数:21  
标签:run 函数 对象 Kotlin append apply 表达式 lambda

Kotlin 标准函数 withrunapply 的定义和使用

1. with 函数

定义

with 函数允许你在一个对象的上下文中执行一个 lambda 表达式,而不需要在 lambda 表达式中重复引用该对象。

@kotlin.internal.InlineOnly
public inline fun <T, R> with(receiver: T, block: T.() -> R): R = receiver.block()

使用场景

当你需要在多个地方引用同一个对象,并且不想每次都显式地写出这个对象名时,可以使用 with 函数。

示例

val stringBuilder = StringBuilder()
with(stringBuilder) {
append("Hello")
append(", ")
append("World!")
}
println(stringBuilder) // 输出 "Hello, World!"
2. run 函数

定义

run 是 Kotlin 中所有类的成员函数,用于在当前对象的上下文中执行一个 lambda 表达式,但不返回任何值(返回 Unit)。

虽然这不是显式定义的函数,但它是通过扩展函数为所有类隐式提供的。

使用场景

当你需要在对象的上下文中执行一些操作,但不需要返回任何结果时,可以使用 run

示例(虽然不常见,因为可以直接在对象上调用方法):

val stringBuilder = StringBuilder()
stringBuilder.run {
append("Hello")
append(", ")
append("World!")
}
println(stringBuilder) // 输出 "Hello, World!"
3. apply 函数

定义

apply 是 Kotlin 的一个扩展函数,它执行给定的 lambda 表达式,并返回调用它的对象本身。

public inline fun <T> T.apply(block: T.() -> Unit): T { block(); return this }

使用场景

当你需要在对象的上下文中执行一些操作,并希望返回该对象以便进行链式调用时,可以使用 apply

示例


val stringBuilder = StringBuilder().apply {
append("Hello")
append(", ")
append("World!")
}
println(stringBuilder) // 输出 "Hello, World!"
区别
  • with:接受一个对象和一个 lambda 表达式,在 lambda 表达式中可以直接调用该对象的方法,无需前缀。返回 lambda 表达式的返回值。
  • run:是类的成员函数,接受一个 lambda 表达式,在 lambda 表达式中可以直接调用该对象的方法。返回 Unit
  • apply:是扩展函数,接受一个 lambda 表达式,在 lambda 表达式中可以直接调用该对象的方法。返回调用它的对象本身。

定义静态方法

在 Kotlin 中,没有直接的“静态方法”概念,但你可以通过以下几种方式实现类似的功能:

  1. 顶层函数:在文件的顶层定义的函数可以在没有类实例的情况下调用。

// MyUtils.kt
fun staticLikeFunction() {
// ...
}
// 在其他文件中
MyUtilsKt.staticLikeFunction() // 注意:Kotlin 会为顶层函数生成一个包含文件名的类(除非你用 @file:JvmName 指定一个名称)
  1. 对象表达式或对象声明:你可以创建一个单例对象,并在其中定义函数。
object MyUtils {
@JvmStatic // 如果你希望这个函数在 Java 中看起来像静态的
fun staticLikeFunction() {
// ...
}
}
// 调用
MyUtils.staticLikeFunction()

标签:run,函数,对象,Kotlin,append,apply,表达式,lambda
From: https://blog.csdn.net/VitorLiu/article/details/139249695

相关文章

  • kotlin基础之协程
    Kotlin协程(Coroutines)是Kotlin提供的一种轻量级的线程模型,它允许我们以非阻塞的方式编写异步代码,而无需使用回调、线程或复杂的并发API。协程是一种用户态的轻量级线程,它可以在需要时挂起和恢复,从而有效地管理资源,提高应用程序的响应性和性能。Kotlin协程的概念轻量级线程:协......
  • Ubuntu下的onnxruntime(c++)编译 转载文章 非原创
    仓库下载gitclone--depth=1--branchv1.12.1https://github.com.cnpmjs.org/microsoft/onnxruntime.git注意:需要更换国内镜像源编译GPU./build.sh--skip_tests--use_cuda--configRelease--build_shared_lib--parallel--cuda_home/usr/local/cuda-11.3--cudnn_home/u......
  • LDRA Testbed(TBrun)软件单元测试_操作指南
    系列文章目录LDRATestbed软件静态分析_操作指南LDRATestbed软件静态分析_自动提取静态分析数据生成文档LDRATestbed软件静态分析_Jenkins持续集成_(1)自动进行静态分析的环境搭建LDRATestbed软件静态分析_Jenkins持续集成_(2)配置邮件自动发送静态分析结果LDRATes......
  • Java三种方法实现多线程,继承Thread类,实现Runnable接口,实现Callable接口
    目录线程:继承Thread类:实现Runnable类:实现Callable接口:验证多线程:线程:定义:进程可以同时执行多个任务,每个任务就是线程。举个例子:一个Java程序,如果同时有两个循环同时进行,就是线程。再比如,你用百度网盘,边看视频,边下载。继承Thread类:步骤写在代码里的classmythrea......
  • kotlin基础之高阶函数
    Kotlin中的高阶函数、内联函数以及noinline和crossinline关键字是函数式编程中的重要概念。下面我将逐一解释这些概念的定义、实现原理、使用场景以及noinline和crossinline关键字的具体用法。高阶函数定义:高阶函数是接受一个或多个函数作为参数,或者返回一个函数的函数。实......
  • 踩坑记录: nohup: failed to run command ‘java‘: No such file or directory
    执行一个shell脚本直接在终端可以执行但是在云效流水线上就会出现这个问题 先查看一下java-version 已经安装好了的话还是出现这个问题解决方案1:在执行Java包的前面加上这个 source/etc/profile还是不可以的话 解决方案2:先查看自己的jdk安装路径 which......
  • RunnerGo V4.6.0 新增功能介绍
    RunnerGo最新V4.6.0版本不仅对原有功能进行了深度优化和改进,还新增了一些新功能。 UI插件:浮窗升级,优化浏览体验此次更新UI插件全新升级至V2.1版本。新版取消了页面内右下角按钮的设计,在浏览器右侧开启了浮窗,从而更方便客户操作浏览器界面。 RunnerGoUI插件本次升级前&后......
  • docker containerd runc containerd-shim等组件的关系
    早期kubelet创建容器工作原理因为docker出生的比k8s早,所以k8s早期的容器运行时都是基于docker的,kubelet通过docker的api创建容器。后来,k8s官方不想绑死在docker这架马车上,就把容器运行时抽象出来,定义了一个接口,叫CRI(containerruntimeinterface),容器......
  • 容器启动流程(containerd 和 runc)
    启动流程containerd作为一个api服务,提供了一系列的接口供外部调用,比如创建容器、删除容器、创建镜像、删除镜像等等。使用docker和ctr等工具,都是通过调用containerd的api来实现的。kubelet通过cri调用containerd和这些不一样,后续我会介绍到。containerd......
  • 在运行Yolov8时报错RuntimeError: torch.cat(): expected a non-empty list of Tensor
    这个错误还算是比较冷门当是又不是太容易发现,在报错出来的时候容易被最后面的提醒误解,我的报错提示如下:RuntimeErrorTraceback(mostrecentcalllast)InputIn[11],in<module>6model=YOLO('./yolov8.yaml').load('./yolov8n.pt......