首页 > 其他分享 >kotlin的run、apply、let、also和with的再次对比说明

kotlin的run、apply、let、also和with的再次对比说明

时间:2023-12-17 17:34:40浏览次数:38  
标签:run 函数 kotlin also let apply block

一、这六个的函数

// 扩展函数run
public inline fun <T, R> T.run(block: T.() -> R): R {
    return block()
}
// 扩展函数let
public inline fun <T, R> T.let(block: (T) -> R): R {
    return block(this)
}
// 扩展函数apply
public inline fun <T> T.apply(block: T.() -> Unit): T {
    block()
    return this
}
// 扩展函数also
public inline fun <T> T.also(block: (T) -> Unit): T {
    block(this)
    return this
}
// 全局函数run
public inline fun <R> run(block: () -> R): R {
    return block()
}
// 全局函数with
public inline fun <T, R> with(receiver: T, block: T.() -> R): R {
    return receiver.block()
}

 

 

二、各个函数的作用和对比

1、扩展函数run和let:let相对run lambda增加了将this传入。其他都是一样的可以使用this,会返回lambda的计算结果。

习惯上,经常会将let与?. 一起使用(当然用run也是可以的,只是说习惯上)

   val listWithNulls: List<String?> = listOf("A", null)
   for (item in listWithNulls) {
       item?.let { println(it) } // Prints A and ignores null
   }

当然我们如果出现函数链的方式将run和let交替使用会使代码更清晰

val list = listOf("Apple", "Banana", "Cherry")
list.maxByOrNull { it.length }?.let { it.toLowerCase() }?.run { println(this) }

 

2、扩展函数apply和also:also相对apply lambda增加了将this传入。其他都是一样的可以使用this,并且函数的返回是this。注意lambda的返回结果均会被忽略。同样出国出现函数链的方式将apply和also交替使用会使代码更清晰

apply更适合改变对象自身,用于一些初始化的操作;also则更加偏向于在处理完对象后还需要做其他相关的操作。
// 创建foo之后,对成员函数进行初始化
val foo = Foo().apply {
    bar = 1
    baz = 2
}

// 创建list之后,进行后续的相关的操作
val list = mutableListOf("item").also { println("$it has been created") }

 

3、全局函数run和with:run只接收一个无参的lambda表达式,with则接收一个对象参数和该对象的扩展函数lambda。注意这两个函数均返回对应lambda值的计算结果

run:可以用来创建一个新的局部作用域。这在需要限制一些临时变量的可见性或者需要计算并返回一些结果时非常有用。

val result = run {
    val x = 1
    val y = 2
    x + y  // 这个表达式的值将被返回
}

with:在with的lambda内部,可以用this表示传入的对象参数。它提供一种简洁的方式来调用同一个对象的多个方法和属性。

with的优点:不仅可以使代码更简洁,还可以把对象的一系列操作包装起来,形成一个独立的逻辑单元,这会使代码更易于阅读和维护。同时它也可以帮助你避免重复地输入同一个对象名。

注意:with接收的对象是要非空的对象,当可能为空的话最好不要用with

 

标签:run,函数,kotlin,also,let,apply,block
From: https://www.cnblogs.com/czwlinux/p/17909358.html

相关文章

  • 一个Servlet如何实现增-删-改-查的业务逻辑
    一、业务场景最近在教学生学习JavaWeb中的Servlet,它就是一个Java服务端的小程序,用来提供各种服务。在讲解得时候,自己突然遇到一个问题,那就是现在没有使用什么SpringMvc框架,可以配置二级路径,该如何使用Servlet实现不同的增、删、改、查的方法呢?这个问题自己一时半会也没想明......
  • Servlet中访问路径配置为/*时,使用请求转发造成内存溢出
    一、问题由来最近在测试Servlet的请求转发功能,准备抽取一个公共的PageJumpTestServlet,用来做页面跳转功能。这样不用每次在测试的时候,都单独写一个Servlet用来做页面跳转。自己最初的设想时,在路径配置的时候使用/toPage/*,访问地址示例http://localhost:8080/javaWeb/toPage......
  • elasticsearch 文档删除操作:delete和delete_by_query
    api:(elasticsearch版本7.3)#删除指定id的文档DELETE/<index>/_doc/<_id>#按查询条件删除POST/<index>/_delete_by_query1.DELETE/<index>/_doc/<_id>删除指定id的文档#测试--删除文档DELETE/king_test_person/_doc/223/2.POST/<index>/_dele......
  • Letax常用数学符号
    Latex常用数学符号1.关系运算符符号LaTeX代码\(=\)=\(\neq\)\neq\(\leq\)\leq\(\geq\)\geq\(\ll\)\ll\(\gg\)\gg\(\leqslant\)\leqslant\(\geqslant\)\geqslant\(\equiv\)\equiv\(\not\equiv\)\not......
  • C++: 智能指针的自定义删除器 `Custom Deleter` 有什么用?
    C++11智能指针std::shared_ptr和std::unique_ptr都支持自定义删除器,本文将介绍自定义删除器的使用场景和使用方法。智能指针模板参数的第二个类型是删除器,一般是一个函数指针类型或者是一个函数对象类型。通常情况下,删除器的类型是std::default_delete<T>,它是一个函数对象类型,用于......
  • 太极 TAICHI-flet
    如果你在搬砖的过程中,想要看书、听歌、看图、看漫画等等,那么我建议你看下这个软件,之前也有推荐过,目前新的版本功能做了完善。不过有个尴尬的点就是,作者增加了会员功能,但是对于基本使用还是没问题的。纯python写的一个工具,最初版本需要自己初始化python环境,现在有直接打包好的wind......
  • 协程与互斥锁: Kotlin Mutex的终极指南
    引言今天我们将深入研究Kotlin中的Mutex(互斥锁)原理以及在实际开发中的使用技巧。Mutex是多线程编程中的关键工具,它可以有效地解决多线程访问共享资源时可能发生的竞态条件问题。Mutex的基本原理Mutex是互斥锁的缩写,它是一种同步工具,用于保护共享资源,确保在任何时刻只有一个线程可以......
  • Tomcat servelet javax 和 jakarta
    *[GitHub-apache/tomcat-jakartaee-migration:ApacheTomcatmigrationtoolforJakartaEE](https://github.com/apache/tomcat-jakartaee-migration)*[未来可期!但别再傻傻分不清javax和jakarta](https://baijiahao.baidu.com/s?id=1758965939027753195)*[[Solved]The......
  • 爬虫遇到`abort` method will be deleted later!怎么解决
     在进行网络爬虫过程中,有时候可能会遇到"abort"methodwillbedeletedlater!的问题,这是由于网站的反爬机制或者请求频率过高导致的。本文将介绍一些解决这个问题的方法和技巧。 1.调整请求频率: 通过减少请求的频率,可以降低被网站检测到的概率。可以使用延时或者随机等方式......
  • prometheus监控k8s集群信息(通过kubelet)
    prometheus监控k8s集群信息(通过kubelet)一、创建prometheus访问k8s权限账户(在k8s集群中操作)。1、在k8s集群中创建服务账户vimprometheus-sa.yamlapiVersion:v1kind:ServiceAccountmetadata:name:prometheus-sanamespace:monitor 2、创建集群角色......