Kotlin(十一) 标准函数with、run和apply

with

with函数接收两个参数:第一个参数可以是一个任意类型的对象,第二个参数是一个Lambda表达式。with函数会在Lambda表达式中提供第一个参数对象的上下文,并使用Lambda表达式中的最后一行代码作为返回值返回。示例代码如下:

val result = with(obj) {// 这里是obj的上下文"value" // with函数的返回值
}

那么这个函数有什么作用呢?它可以在连续调用同一个对象的多个方法时让代码变得更加精简,下面我们来看一个具体的例子。

比如有一个水果列表,现在我们想吃完所有水果,并将结果打印出来,就可以这样写:

    val  list = listOf("苹果","香蕉","梨","火龙果","芭蕉","椰子")val  builder = StringBuilder()builder.append("开始\n")for (fruit in list){builder.append(fruit).append("\n")}builder.append("结束\n")println(builder.toString())

仔细观察上述代码,你会发现我们连续调用了很多次builder对象的方法。其实这个时候就可以考虑使用with函数来让代码变得更加精简,如下所示:

    val builderWith = with(StringBuilder()) {append("开始\n")for (fruit in list) {append(fruit).append("\n")}append("结束").append("\n")toString()}println(builderWith)

这两段代码的执行结果是一模一样的,但是明显第二段代码的写法更加简洁一些,这就是with函数的作用。

run

run函数的用法和使用场景其实和with函数是非常类似的,只是稍微做了一些语法改动而已。首先run函数通常不会直接调用,而是要在某个对象的基础上调用;其次run函数只接收一个Lambda参数,并且会在Lambda表达式中提供调用对象的上下文。其他方面和with函数是一样的,包括也会使用Lambda表达式中的最后一行代码作为返回值返回。示例代码如下:

val result = obj.run {// 这里是obj的上下文"value" // run函数的返回值
}

那么现在我们就可以使用run函数来修改一下吃水果的这段代码,如下所示:

    val builderRun = StringBuilder().run {append("开始\n")for (fruit in list) {append(fruit).append("\n")}append("结束").append("\n")toString()}println(builderRun)

总体来说变化非常小,只是将调用with函数并传入StringBuilder对象改成了调用StringBuilder对象的run方法,其他都没有任何区别,这两段代码最终的执行结果是完全相同的。

apply

apply函数和run函数也是极其类似的,都要在某个对象上调用,并且只接收一个Lambda参数,也会在Lambda表达式中提供调用对象的上下文,但是apply函数无法指定返回值,而是会自动返回调用对象本身。示例代码如下:

val result = obj.apply {// 这里是obj的上下文
}
// result == obj

那么现在我们再使用apply函数来修改一下吃水果的这段代码,如下所示:

    val builderApply = StringBuilder().apply {append("开始\n")for (fruit in list) {append(fruit).append("\n")}append("结束").append("\n")}println(builderApply.toString())

注意这里的代码变化,由于apply函数无法指定返回值,只能返回调用对象本身,因此这里的result实际上是一个StringBuilder对象,所以我们在最后打印的时候还要再调用它的toString()方法才行。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/163780.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python常用第三方模块 --- Pyinstaller(把程序打包成可执行程序)

打包方法: 在cmd下进行 pyinstaller -F 路径/程序文件名 注意:使用pyinstaller之前需要安装 pip install pyinstaller

ELK架构

经典的ELK 经典的ELK主要是由Filebeat Logstash Elasticsearch Kibana组成,如下图:(早期的ELK只有Logstash Elasticsearch Kibana) 此架构主要适用于数据量小的开发环境,存在数据丢失的危险。 整合消息队列Ngin…

如何用网格交易做ETF套利

ETF套利是指利用ETF基金的交易机制,通过短期的买卖差价或组合投资来获取利润。 具体来说,ETF套利最常用的套利方法则是:价格套利和波动套利。 1. 价格套利:当ETF二级市场的价格与一级市场的净值出现偏差时,投资者可以通…

【SwiftUI】7.预览及其内部机制

上一篇讲到了组件及组件化,从概念和优/缺点两个方向说明了组件化的意义,更为重要的是,组件和组件化是一个在编程领域,放之四海皆可以的概念,理解和运用它是非常必要的,希望大家能掌握。今天我们介绍另一个特…

Element UI的Tabs 标签页位置导航栏去除线条

在实际开发中,我们调整了相关样式,导致导航栏的相关样式跟随不上,如下图所示: 因为我跳转了前边文字的样式并以在导航栏添加了相关头像,导致右边的线条定位出现问题,我在想,要不我继续调整右边…

开发B2B商城的意义

开发B2B商城的意义主要体现在以下几个方面: 采购成本低:利用互联网采购,B2B商城的采购商可直接通过线上完成全部流程操作,在提高采购效率的同时,大大降低了B2B工业品企业采购成本。推广优势大:B2B商城的曝…

YM5411 WIFI 5模块 完美替代AP6256

YM5411是沃特沃德推出的一款低成本,低功耗的模块,该模块具有Wi-Fi(2.4GHz和5GHz IEEE 802.11 a/b/g/n/ac)蓝牙(BT5.0)功能,并通过了SRRC认证,带mesh,完美替换AP6256。高度…

OpenHarmony之NAPI框架介绍

张志成 诚迈科技高级技术专家 NAPI是什么 NAPI的概念源自Nodejs,为了实现javascript脚本与C库之间的相互调用,Nodejs对V8引擎的api做了一层封装,称为NAPI。可以在Nodejs官网(https://nodejs.org/dist/latest-v20.x/docs/api/n-api…

【python爬虫】scrapy在pycharm 调试

scrapy在pycharm 调试 1、使用scrapy创建一个项目 scrapy startproject tutorial 2、在朋友pycharm中调试scrapy 2.1 通过文件run.py调试 在根目录下新建一个文件run.py(与scrapy.cfg文件的同一目录下), debug ‘run’即可 # -*- coding:utf-8 -*- from scrapy import c…

深入浅出理解libevent——2万字总结

概述 libevent,libev,libuv都是c实现的异步事件库,注册异步事件,检测异步事件,根据事件的触发先后顺序,调用相对应回调函数处理事件。处理的事件包括:网络 io 事件、定时事件以及信号事件。这三个事件驱动着服务器的运…

数字人是真人吗?

引言: 随着科技的不断进步,数字人作为一种新兴技术正逐渐崭露头角。数字人是通过计算机生成的虚拟人物,具备逼真的外貌和行为,令人难以分辨其与真人的差异。本文将探讨数字人是否可以被视为真人,并探索数字人技术在各个…

柯桥生活日语学习,打工人的日语你会吗?

打工人在日语里有几种说法: アルバイト 这是最常用的称呼,直接对应中文的“打工”。 例句: 学生の頃はスーパーでアルバイトをしていた。(我学生时代在超市打过工。) バイト これはアルバイトの略称でよく使われる。(这是アルバイト的简称,也很常用。) 例句: バイト先が決…

《第一行代码:Android》第三版-2.4.1 if 语句

本文主要讲解if语句,kotlin的if语句是可以有返回值的,就是if语句的最后一句话就是返回值。 /*** You can edit, run, and share this code.* play.kotlinlang.org*/fun main() {println("Hello, world!!!") val largelargerNumber(5,9) prin…

如何提高希音、亚马逊、国际站店铺流量转化,自养号优势及测评底层环境逻辑

随着全球贸易数字化程度加快,尤其是跨境电商的发展日新月异,在外贸出口占比越来越高,在这其中,亚马逊作为全球实力强劲的在线零售平台之一,吸引了大量的优秀卖家。 而这也加剧了亚马逊平台的竞争程度,尤其…

HCIP数据通信——BGP协议

引言 我之前写过一篇介绍ISIS的文章,我打算把BGP知识总结以后再做实验。那么现在就讲述一下BGP的一些特点和概念。 BGP特点 BGP属于EGP(EGP也是BGP前身,指的是具体协议,被淘汰了成为了BGP),无类协议。 它…

C++(14):解决lambda生命期问题

C++(11):局部函数lambda_c++11 函数中定义函数-CSDN博客 中通过实例列举了lambda使用过程中可能会有变量生命期问题。 C++14中可以通过重新定义变量,并转移,解决这个问题: #include <iostream> using namespace std;class A { public:A(int data):m_data(data){cou…

继承中:一般函数的virtual虚函数特性、析构函数的virtual虚函数特性

1、一般的同名函数 c规定&#xff0c;当一个成员函数被声明为虚函数后&#xff0c;其派生类中的同名函数都自动成为虚函数。因此&#xff0c;在子类重新声明该虚函数时&#xff0c;可以加&#xff0c;也可以不加&#xff0c;但习惯上每一层声明函数时都加virtual,使程序更加清…

postgresql数据库中update使用的坑

简介 在数据库中进行增删改查比较常见&#xff0c;经常会用到update的使用。但是在近期发现update在oracle和postgresql使用却有一些隐形区别&#xff0c;oracle 在执行update语句的时候set 后面必须跟着1对1的数据关联而postgresql数据库却可以一对多&#xff0c;这就导致数据…

完整的工程项目管理流程是怎么样的?

阅读本文你将了解工程项目管理的完整流程&#xff1a;一、项目启动阶段&#xff1b;二、项目规划阶段&#xff1b;三、项目执行阶段&#xff1b;四、项目收尾阶段&#xff1b;五、项目总结与反馈。 这是一个工程项目管理的完整流程&#xff1a; 项目启动阶段&#xff1a;也就…

xlsxwriter.exceptions.FileCreateError: [Errno 13] Permission denied: ‘E:

xlsxwriter.exceptions.FileCreateError: [Errno 13] Permission denied: ‘E:\、、、、、’ 如果你尝试了各种修改文件权限的方法都还不行的话 有可能是因为你打开了想要修改的文件&#xff0c;关闭就好啦