Kotlin常用内联函数的手写和解释

1、什么是内联函数

      使用inline关键字修饰的函数被称为内联函数,其作用是在编译阶段将函数体的代码直接嵌入到函数调用处,而不是通过函数调用的方式来执行,这样可减少函数调用带来的额外开销,如传递参数,创建和销毁栈帧等, 可以使代码更加简洁直观。

2、Kotlin中常见的内联函数

apply:该函数参数中lambda体持有当前调用者对象this,返回结果为本身即obj.适合链式调用场景。

使用方式:

obj.apply{//持有this

        ///lambda执行代码块

}.apply{

        ///lambda执行代码块

}...

run:该函数参数中lambda体持有当前调用者对象this,返回结果为lambda表达式执行返回的结果.

使用方式:

obj.run{//持有this

        ///lambda执行代码块,最后一行的返回值就是run函数的返回值

}

let:该函数的调用者作为函数体唯一参数,故参数中lambda体持有it,返回结果为lambda表达式执行返回的结果

使用方式:

obj.let{//持有it

        //lambda执行代码块,最后一行的返回值为let函数的返回值

}

also:函数参数中的lambda体持有it,返回结果为当前调用对象,因此也适合链式调用。

使用方式:

obj.also{//持有it

        ///lambda执行代码块

 }.also{//持有it

        ///lambda执行代码块

 }

with:该函数的lambda体也是持有this,函数的返回结果为lambda表达式执行返回的结果,作用类似于run函数,只是调用方式不同

使用方式:

with(obj) {

        //lambda执行代码块

}

3、手写内联函数

内联函数的实现实际上使kotlin高阶函数的一个运用场景,参数中都包含lambda表达式。所谓高阶函数就是函数的参数或者返回值类型为函数的函数。以下为上面五个内联的函数的手写实现,跟源码差不多。

手写apply

inline fun <T> T.myApply(lambda:T.()->Unit):T {

        lambda()

        return this

}

手写run

inline fun <T, R> T.myRun(lambda:T.()->R):R{

        return lambda()

}

手写let

inline fun <T, R> T.myLet(lambda:(T)->R):R {

        return lambda(this)

}

手写also

inline fun <T> T.myAlso(lambda:(T)->Unit):T{

        lambda(this)

        return this

}

手写with

inline fun <T, R> myWith(receiver:T, lambda:T.()->R):R {

        return receiver.lambda()

}

注意:apply\run\let\also是对泛型函数的扩展,即任何类型的对象都可以直接调用,而with为一个普通的高阶函数,使用方式与其他四个不一样。

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

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

相关文章

【解释】i.MX6ULL_IO_电气属性说明

【解释】i.MX6ULL_IO_电气属性说明 文章目录 1 Hyst1.1 迟滞&#xff08;Hysteresis&#xff09;是什么&#xff1f;1.2 GPIO的Hyst. Enable Field 参数1.3 应用场景 2 Pull / Keep Select Field2.1 PUE_0_Keeper — Keeper2.2 PUE_1_Pull — Pull2.3 选择Keeper还是Pull 3 Dr…

企业化运维(6)_redis数据库

Redis&#xff08;Remote Dictionary Server )&#xff0c;即远程字典服务&#xff0c;是一个开源的使用ANSIC语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库&#xff0c;并提供多种语言的API。 redis是一个key-value存储系统。和Memcached类似&#xff0…

C#进阶-ASP.NET WebForms调用ASMX的WebService接口

ASMX 文件在 ASP.NET WebForms 中提供了创建 Web 服务的便捷方式&#xff0c;通过公开 Web 方法&#xff0c;允许远程客户端调用这些方法并获取数据。本文介绍了 ASMX 文件的基本功能、如何定义 WebService 接口、通过 HTTP 和 SOAP 请求调用 WebService 接口&#xff0c;以及使…

bgr24包装为bmp图像

code void BGR24ToBMP(const int width, const int height, uint8_t *framedata, const char *outfile) {BITMAPFILEHEADER bmp_header; // 声明BMP文件的头结构BITMAPINFOHEADER bmp_info; // 声明BMP文件的信息结构unsigned int data_size (width * 3 3) / 4 * 4 * heig…

[AIGC] Shell脚本在工作中的常用用法

Shell脚本是一种为 shell 编写的脚本程序。商业上的 Unix Shell 一般都配备图形界面&#xff0c;主要包括&#xff1a;Bourne Shell&#xff08;/usr/bin/sh或/bin/sh&#xff09;、Bourne Again Shell&#xff08;/bin/bash&#xff09;、C Shell&#xff08;/usr/bin/csh&…

简单多状态DP问题

这里写目录标题 什么是多状态DP解决多状态DP问题应该怎么做&#xff1f;关于多状态DP问题的几道题1.按摩师2.打家劫舍Ⅱ3.删除并获得点数4.粉刷房子5.买卖股票的最佳时期含手冷冻期 总结 什么是多状态DP 多状态动态规划&#xff08;Multi-State Dynamic Programming, Multi-St…

vue2实例实现一个初步的vue-router

vue2实例实现一个初步的vue-router 实现源码&#xff1a;vue2-review 1.App.vue 2.router目录下的index.js 3.自己实现的x-router.js 4.自己实现的xrouter-view.js 5.自己实现的xrouter-link.js 6.效果 微信公众号&#xff1a;刺头拾年

AI奥林匹克竞赛:Claude-3.5-Sonnet对决GPT-4o,谁是最聪明的AI?

目录 实验设置 评估对象 评估方法 结果与分析 针对学科的细粒度分析 GPT-4o vs. Claude-3.5-Sonnet GPT-4V vs. Gemini-1.5-Pro 结论 AI技术日新月异&#xff0c;Anthropic公司最新发布的Claude-3.5-Sonnet因在知识型推理、数学推理、编程任务及视觉推理等任务上设立新…

【雷达原理】雷达测角原理及实现方法

目录 一、雷达测角原理1.1 测角研究历史和现状1.2 测角方法总结1.3 3DFFT测角1.3.1 基本原理1.2.2 测角性能 二、MATLAB仿真案例参考文献 一、雷达测角原理 1.1 测角研究历史和现状 &#xff08;1&#xff09;早期采用窄波束对准目标&#xff0c;目标的角度对应于天线的角度读…

【动态规划】139. 单词拆分

139. 单词拆分 难度&#xff1a;中等 力扣地址&#xff1a;https://leetcode.cn/problems/word-break/description/ 问题描述 给你一个字符串 s 和一个字符串列表 wordDict 作为字典。如果可以利用字典中出现的一个或多个单词拼接出 s 则返回 true。 注意&#xff1a;不要求字…

INS-GPS组合导航——卡尔曼滤波

系列文章目录 《SAR笔记-卫星轨道建模》 《SAR笔记-卫星轨迹&#xff08;三维建模&#xff09;》 《常用坐标系》 文章目录 前言 一、经典卡尔曼滤波 二、扩展卡尔曼滤波 三、无迹卡尔曼滤波 总结 前言 SAR成像仪器搭载于运动平台&#xff0c;平台的自定位误差将影响SAR…

使用 pip 换源的指南

使用 pip 换源的指南 Python 包管理工具 pip 通常从官方的 PyPI&#xff08;Python Package Index&#xff09;仓库下载包。但由于网络限制或速度问题&#xff0c;我们可以选择使用国内镜像源来加速包的下载。以下是如何通过不同方法更改 pip 的下载源&#xff1a; 一、通过命…

LeetCode-Leetcode 1120:子树的最大平均值

LeetCode-Leetcode 1120&#xff1a;子树的最大平均值 题目描述&#xff1a;解题思路一&#xff1a;递归解题思路二&#xff1a;0解题思路三&#xff1a;0 题目描述&#xff1a; 给你一棵二叉树的根节点 root&#xff0c;找出这棵树的 每一棵 子树的 平均值 中的 最大 值。 子…

还不知道工业以太网和现场总线区别???

工业以太网 工业以太网是一种专为工业环境设计的网络通信技术&#xff0c;它基于标准的以太网技术&#xff0c;但针对工业应用进行了优化。工业以太网能够适应高温、低温、防尘等恶劣工业环境&#xff0c;采用TCP/IP协议&#xff0c;与IEEE 802.3标准兼容&#xff0c;并在应用层…

Studying-代码随想录训练营day24| 93.复原IP地址、78.子集、90.子集II

第24天&#xff0c;回溯算法part03&#xff0c;牢记回溯三部曲&#xff0c;掌握树形结构结题方法&#x1f4aa; 目录 93.复原IP地址 78.子集 90.子集II 总结 93.复原IP地址 文档讲解&#xff1a;代码随想录复原IP地址 视频讲解&#xff1a;手撕复原IP地址 题目&#xff1…

安全架构概述_3.与信息安全相关的国内外标准及组织

1.国外标准 &#xff08;1&#xff09;可信计算机系统评估准则&#xff08;Trusted Computer System Evaluation Criteria&#xff0c;TCSEC&#xff09;&#xff0c;也称为“橘皮书”&#xff0c;1985年12月有美国国防部公布。 &#xff08;2&#xff09;信息技术安全评估准则…

如何利用python画出AHP-SWOT的战略四边形(四象限图)

在企业或产业发展的相关论文分析中&#xff0c;常用到AHP-SWOT法进行定量分析&#xff0c;形成判断矩阵后&#xff0c;如何构造整洁的战略四边形是分析的最后一个环节&#xff0c;本文现将相关代码发布如下&#xff1a; import mpl_toolkits.axisartist as axisartist import …

玩转springboot之springboot定制嵌入式的servlet

springboot定制嵌入式的servlet容器 修改容器配置 有两种方式可以修改容器的配置 可以直接在配置文件中修改和server有关的配置 server.port8081 server.tomcat.uri-encodingUTF-8//通用的Servlet容器设置 server.xxx //指定Tomcat的设置 server.tomcat.xxx编写一个EmbeddedSer…

5. web信息收集(OWASP实战训练)

5. web信息收集&#xff08;OWASP实战训练&#xff09; 1. 信息收集概述2. Google hacking2.1 Site2.2 filetype2.3 inurl2.4 intitle2.5 intext2.6 实例2.7 符号 3. shodan hacking3.1 IP3.2 service/protocol3.3 keyword3.4 country3.5 product3.6 version3.7 hostname3.8 os…

解决本机电脑只能通过localhost访问,不能通过127.0.0.1访问

背景问题 有天我启动项目&#xff0c;发现项目连接Mysq总是连接不上&#xff0c;查了url、ip、port、用户名和密码都没有错&#xff0c;就是连接不上mysql数据库&#xff0c;后来通过查找资料发现有多个进程占用3306端口。 pid 6016 是mysqld服务 而pid 9672 是一个叫 svchos…