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

【Android】Kotlin 中的 apply、let、with、also、run 到底有啥区别?

一、图示 

二、apply

apply 函数接收一个对象并返回该对象本身。它允许您在对象上执行一些操作,同时仍然返回原始对象。

这个函数的语法为:

fun <T> T.apply(block: T.() -> Unit): T

其中,T 是对象的类型,block 是一个 lambda 表达式,可以在该对象上执行一些操作。在这个 lambda 中,您可以使用 this 关键字来引用当前对象。

例如:

val person = Person().apply { name = "wsy" age = 20 address = "HangZhou" }

在这个例子中,我们创建了一个 Person 对象并在 apply 函数中设置了该对象的属性。最终返回的是这个 Person 对象本身。

三、let

let 同样是一个扩展函数,它也接收一个 Lambda 表达式作为参数。不同于 apply,在 Lambda 表达式中,let 函数将接收者对象作为 Lambda 的参数,通常用 it 作为隐式名称。let 函数的返回值是 Lambda 表达式的结果。

这个函数的语法为:

kotlinCopy code fun <T, R> T.let(block: (T) -> R): R

其中,T 是对象的类型,R 是返回值的类型,block 是一个 lambda 表达式,它对该对象进行一些操作并返回一个结果。

val person = Person("Alice", 25) val ageAfterFiveYears = person.let { it.age + 10 }

在这个示例中,let 函数用于计算 Person 对象五年后的年龄。

四、also

also 是一个扩展函数,与 apply 类似,但有一个关键区别:also 函数的返回值是接收者对象本身,而 Lambda 表达式的参数是接收者对象,通常用 it 作为隐式名称。 这个函数的语法为:

fun <T> T.also(block: (T) -> Unit): T

其中,T 是对象的类型,block 是一个 lambda 表达式,可以在该对象上执行一些操作。在这个 lambda 中,您可以使用 it 关键字来引用当前对象。

val person = Person("XiaoYan", 18).also { it.name = "Wsy" it.age = 20 }

在上述示例中,also 函数用于修改 Person 类的属性,最后返回修改后的对象。

五、run

run 是一个扩展函数,它结合了 applylet 的特点。run 函数在 Lambda 表达式中直接访问接收者对象的属性和方法,同时返回 Lambda 表达式的结果。

这个函数的语法为:

fun <T, R> T.run(block: T.() -> R): R

其中,T 是对象的类型,R 是返回值的类型,block 是一个 lambda 表达式,它对该对象进行一些操作并返回一个结果。在这个 lambda 中,您可以使用 this 关键字来引用当前对象。

val person = Person("Wsy", 25) 
val greeting = person.run { "Hello, $name! You are $age years old." }

在这个示例中,run 函数用于生成一个包含 Person 对象信息的字符串。

六、总结

四个函数的相同点是,它们都可以操作对象,并可以在 lambda 中引用当前对象。但是,它们的返回值和返回时机有所不同。

apply 和 also 函数的返回值是该对象本身,而 let 和 run 函数的返回值是 lambda 表达式的结果。

apply 函数在对象上执行一些操作,并返回该对象本身。它通常用于在对象创建后立即对其进行初始化。

also 函数类似于 apply 函数,但它返回原始对象的引用。它通常用于对对象进行一些副作用,例如打印日志或修改对象状态。

let 函数在 lambda 中对对象进行一些操作,并返回 lambda 表达式的结果。它通常用于在某些条件下对对象进行转换或计算。

run 函数类似于 let 函数,但它返回 lambda 表达式的结果。它通常用于对对象进行计算,并返回计算结果。

总之,这四个函数都是非常有用的函数式编程工具,可以帮助您以简洁、可读性强的方式操作对象和代码块。对于每个情况,您应该选择最合适的函数,以便以最有效的方式编写代码。

 

相关文章:

【Android】Kotlin 中的 apply、let、with、also、run 到底有啥区别?

一、图示 二、apply apply 函数接收一个对象并返回该对象本身。它允许您在对象上执行一些操作&#xff0c;同时仍然返回原始对象。 这个函数的语法为&#xff1a; fun <T> T.apply(block: T.() -> Unit): T 其中&#xff0c;T 是对象的类型&#xff0c;block 是一…...

设计模式——职责链模式

职责链模式 职责链模式职责链模式解决什么问题&#xff1f;职责链模式实现 职责链模式 使多个对象都有机会处理请求&#xff0c;从而避免请求的发送者和接收者之间的耦合关系。将这个对象练成一条链&#xff0c;并沿着这条链传递该请求&#xff0c;知道有一个对象处理它为止 …...

小程序自定义tabbar,中间凸起

微信小程序自带tabbar&#xff0c;但无法实现中间按钮凸起样式和功能&#xff0c;因此按照设计重新自定义一个tabbar 1、创建tabbar文件&#xff0c;与pages同级创建一个文件夹&#xff0c;custom-tab-bar,里面按照设计图将底部tabbar样式编写 <view class"tab-bar&q…...

数据结构-顺序栈C++示例

栈(stack)是限定仅在表尾进行插入或删除操作的线性表。 对栈来说&#xff0c;表尾端称为栈顶(top)&#xff0c; 表头端称为栈底(bottom)&#xff0c;不含元素的空表称为空栈。 假设栈 S ( a 1 , a 2 , a 3 , ⋯ , a n ) S(a_1,a_2,a_3,\cdots,a_n) S(a1​,a2​,a3​,⋯,an​…...

若依cloud -【 100 ~ 103 】

100 分布式日志介绍 | RuoYi 分布式日志就相当于把日志存储在不同的设备上面。比如若依项目中有ruoyi-modules-file、ruoyi-modules-gen、ruoyi-modules-job、ruoyi-modules-system四个应用&#xff0c;每个应用都部署在单独的一台机器里边&#xff0c;应用对应的日志的也单独存…...

可转债实战与案例分析——成功的和失败的可转债投资案例、教训与经验分享

实战与案例分析——投资案例研究 股票量化程序化自动交易接口 一、成功的可转债投资案例 成功的可转债投资案例提供了有价值的经验教训&#xff0c;以下是一个典型的成功案例&#xff1a; 案例&#xff1a;投资者B的成功可转债投资 投资者B是一位懂得风险管理的投资者&#…...

@NotNull注解不生效,全局异常处理

1.引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validation</artifactId><version>3.1.2</version> </dependency> 2&#xff1a;实体类 实体类属性加上NotNull注解…...

【办公自动化】使用Python一键往Word文档的表格中填写数据(文末送书)

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…...

OpenHarmony应用核心技术理念与需求机遇简析

一、核心技术理念 图片来源&#xff1a;OpenHarmony官方网站 二、需求机遇简析 新的万物互联智能世界代表着新规则、新赛道、新切入点、新财富机会;各WEB网站、客户端( 苹果APP、安卓APK)、微信小程序等上的组织、企业、商户等;OpenHarmony既是一次机遇、同时又是一次大的挑战&…...

让Pegasus天马座开发板实现超声波测距

在完成《让Pegasus天马座开发板用上OLED屏》后&#xff0c;我觉得可以把超声波测距功能也在Pegasus天马座开发板上实现。于是在箱子里找到了&#xff0c;Grove - Ultrasonic Ranger 这一超声波测传感器。 官方地址: https://wiki.seeedstudio.com/Grove-Ultrasonic_Ranger 超声…...

C++11 多线程学习

C11学习 一、多线程 1、模板线程是以右值传递的 template <class Fn, class... Args> explicit thread(Fn&& fn, Args&&... args)则需要使用到std::ref和std::cref很好地解决了这个问题&#xff0c;std::ref 可以包装按引用传递的值。 std::cref 可以…...

数学公式测试

MVP变换 MVP变换用来描述视图变换的任务&#xff0c;即将虚拟世界中的三维物体映射&#xff08;变换&#xff09;到二维坐标中。 MVP变换分为三步&#xff1a; 模型变换(model tranformation)&#xff1a;将模型空间转换到世界空间&#xff08;找个好的地方&#xff0c;把所…...

机器学习——SVM(支持向量机)

0、前言&#xff1a; SVM应用&#xff1a;主要针对小样本数据进行学习、分类和回归&#xff08;预测&#xff09;&#xff0c;能解决神经网络不能解决的过学习问题&#xff0c;有很好的泛化能力。&#xff08;注意&#xff1a;SVM算法的数学原理涉及知识点比较多&#xff0c;所…...

【李沐深度学习笔记】基础优化方法

课程地址和说明 基础优化方法p2 本系列文章是我学习李沐老师深度学习系列课程的学习笔记&#xff0c;可能会对李沐老师上课没讲到的进行补充。 基础优化方法 在讲具体的线性回归实现之前&#xff0c;要先讲一下基础的优化模型的方法 梯度下降 当模型没有显示解&#xff08…...

tmux 配置vim风格按键,支持gbk编码

vim修改~/.tmux.conf文件&#xff0c;没有则新增&#xff0c;添加如下内容。默认前缀更改为Ctrla。强烈建议更换Caps lock键位与Ctrl键位&#xff0c;用过的都说好&#xff0c;换过就回不来了。 unbind C-b set -g prefix C-a bind a send-prefixset -sg escape-time 1bind r …...

Python —— excel文件操作(超详细)

背景 很多公司还是用excel去管理测试用例的&#xff0c;所以为了减少重复繁琐的导出导出工作&#xff0c;学会如何用代码操作excel表格很实用~ 1、读取excel文件基本步骤 1、操作excel的一些库 1、xlrd&#xff1a;读取库&#xff0c;xlwt&#xff1a;写入&#xff0c;现在…...

什么是AI问答机器人?它的应用场景有哪些?

近年来&#xff0c;由于技术的进步和对个性化客户体验的需求不断增长&#xff0c;AI问答机器人也是获得了巨大的关注。AI问答机器人&#xff0c;也被称为AI聊天机器人&#xff0c;是一种旨在模拟人类对话并通过基于文本或语音的界面与用户交互的计算机程序。其能够自动执行各种…...

静态文件

静态文件 静态文件配置 - settings.py中 1&#xff0c;配置静态文件的访问路径【该配置默认存在】 通过哪个url地址找静态文件 STATIC URL‘/static/’ 说明 指定访问静态文件时是需要通过/static/xxx或http://127.0.0.1:8000/static/xxx [xxx表示具体的静态资源位置] 模…...

Centos7 自部署中间件开机启动,以及java应用开机启动方法

一、zookeeper cd /etc/rc.d/init.d/ touch zookeeper chmod x zookeeper vi zookeeper#以下为内容&#xff0c;自行修改 路径#!/bin/bash ##chkconfig:2345 10 90#description:service zookeeper #修改为自己的目录 export ZOO_LOG_DIR/data/apache-zookeeper-3.7.0/logs…...

密度估计公式

极大似然估计&#xff1a; y p ( x 1 , x 2 , x 3 , . . . , x n ) 1 2 π σ e − ( x 1 − μ ) 2 2 σ 2 1 2 π σ e − ( x 2 − μ ) 2 2 σ 2 . . . 1 2 π σ e − ( x n − μ ) 2 2 σ 2 y p(x_1,x_2,x_3,...,x_n) \frac{1}{\sqrt{2\pi} \sigma} e ^{-\frac{(x_1…...

【STM32】GuiLite在HAL库环境下的轻量级GUI移植实战

1. GuiLite框架简介 第一次接触GuiLite是在一个资源紧张的STM32F103项目上&#xff0c;当时需要给设备加个简单的用户界面&#xff0c;但传统的GUI框架动不动就几十KB的代码量实在吃不消。GuiLite这个只有5千行C代码的轻量级框架完美解决了我的痛点。 它的核心优势可以用三个关…...

别再只用差速轮了!手把手教你为Navigation2仿真打造专属阿克曼底盘模型(附完整URDF/SDF文件)

从差速轮到阿克曼&#xff1a;打造高仿真Navigation2底盘模型的完整指南 在机器人仿真领域&#xff0c;差速轮底盘因其简单可靠而广受欢迎&#xff0c;但真实世界的车辆大多采用阿克曼转向机制。本文将带您深入理解两种模型的本质差异&#xff0c;并手把手指导如何从零构建或改…...

Spire性能优化技巧:如何高效使用Rational和SafeLong提升Scala数值计算效率

Spire性能优化技巧&#xff1a;如何高效使用Rational和SafeLong提升Scala数值计算效率 【免费下载链接】spire Powerful new number types and numeric abstractions for Scala. 项目地址: https://gitcode.com/gh_mirrors/spi/spire Spire作为Scala的强大数值库&#x…...

别再手动画框了!用CVAT的自动标注和插值功能,10分钟搞定一段视频标注

别再手动画框了&#xff01;用CVAT的自动标注和插值功能&#xff0c;10分钟搞定一段视频标注 视频标注是计算机视觉项目中最耗时的工作之一。想象一下&#xff0c;你需要为一段30秒的交通监控视频&#xff08;约900帧&#xff09;标注所有车辆的位置——传统方法可能需要8小时以…...

新消费品牌的详情页,不该是产品说明书

很多企业做电商页面时&#xff0c;会把重点放在“展示产品”上。图片要好看&#xff0c;卖点要完整&#xff0c;参数要齐全&#xff0c;详情页要显得丰富&#xff0c;品牌故事要讲出来&#xff0c;工艺优势要摆出来&#xff0c;证书、原料、产地、功能、包装、规格、适用人群&a…...

免费开源AMD Ryzen调试工具:SMUDebugTool完整使用指南与性能调优实战

免费开源AMD Ryzen调试工具&#xff1a;SMUDebugTool完整使用指南与性能调优实战 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. 项目地…...

枚举进阶:从常量集合到业务逻辑承载者的实战扩展技巧

1. 项目概述&#xff1a;从“能用”到“好用”的枚举进阶之路在软件开发中&#xff0c;枚举&#xff08;Enum&#xff09;是我们再熟悉不过的基础工具了。它把一组有限的、具名的常量组织在一起&#xff0c;让代码意图更清晰&#xff0c;避免“魔法数字”满天飞。但不知道你有没…...

告别Nginx配置!用miniserve在Windows/Mac/Linux三分钟内搞定文件共享

告别Nginx配置&#xff01;用miniserve在Windows/Mac/Linux三分钟内搞定文件共享 你是否曾在团队协作时&#xff0c;为了快速分享一个安装包或设计稿&#xff0c;不得不忍受FTP的繁琐配置&#xff1f;或是被Nginx的虚拟主机设置搞得头晕目眩&#xff1f;现在&#xff0c;这一切…...

DCNv4:重塑视觉模型核心,三倍速率的动态稀疏卷积如何炼成?

1. 从标准卷积到DCNv4的进化之路 计算机视觉领域的核心算子就像乐高积木里的基础模块&#xff0c;决定了整个模型的表达能力。传统卷积就像用固定形状的积木拼图&#xff0c;虽然稳定但缺乏灵活性。2017年诞生的可变形卷积&#xff08;DCN&#xff09;首次给积木加上了"可…...

AIGC 检测‘句长标准差‘到底是什么?嘎嘎降 AI 帮你 AI 率从 70% 降到 7%

AIGC 检测"句长标准差"到底是什么&#xff1f;嘎嘎降 AI 帮你 AI 率从 70% 降到 7% AIGC 检测算法 4.0 版本看的 5 项底层指标里——句长标准差权重最高&#xff08;约 35%&#xff09;。理解了这一项你就知道为什么手改一周降不下 AI 率。这篇文章把"句长标准差…...