Kotlin中的内置函数-apply、let

在使用Kotlin的过程中会经常用到其内置函数,包括apply,let,run,with,also,takeIf,takeUnless函数等,想要更好熟悉Kotlin,这些函数必须烂熟于心,接下来让我们来逐步了解:

apply函数

apply函数,属于内联扩展函数,其扩展了所有的泛型对象,在闭包范围内可以任意调用该对象的任意方法,并在最后返回该对象。也许看到这里你并没有太了解,接下来让我们从简单代码入手:

fun main(){val tips = "Hello this world"println("tips的字符串长度为:${tips.length}")println("tips的最后一个字符为:${tips[tips.length-1]}")println("tips全部置换大小写:${tips.lowercase()}")
}

这段函数很简单,定义一个字符串然后分别打印,对应输出结果为:

image.gif
我们加入apply函数,一般情况下,匿名函数都会持有一个it,但是apply函数没有持有it,而是持有当前this,在这里this = tips本身。我们在原函数中加入对this的引用逻辑,例如以下:

fun main(){val tips = "Hello this world"println("tips的字符串长度为:${tips.length}")println("tips的最后一个字符为:${tips[tips.length-1]}")println("tips全部置换大小写:${tips.lowercase()}")tips.apply { println(this)}
}

对应的打印为:
image.gif
可见,最后打印的this即是tips本身,而在apply中this又可以省略,我们修改打印到对应的apply函数中,则原代码变为以下:

fun main(){val tips = "Hello this world"println("tips的字符串长度为:${tips.length}")println("tips的最后一个字符为:${tips[tips.length-1]}")println("tips全部置换大小写:${tips.lowercase()}")println("---------------------------------------")tips.apply {println(this)println("tips的字符串长度为:${length}")println("tips的最后一个字符为:${this[length-1]}") //这里最外面的this不能省(Collection literals outside of annotations)println("tips全部置换大小写:${this.lowercase()}")}
}

其对应输出结果为:

image.gif
这些不难理解,所以这里我们可以说apply函数扩展的是其对象,同时还能返回生成此对象。那么问题来了,我要这函数有何用?一个语言不可能白设计一个没有作用的函数。比如我们通常声明一个文件,还要同时声明此文件一些特点时:

val file = File("C:\\HelloWorld.java")
file.setReadable(true)
file.setReadOnly()

这样修改为:

val file = File("C:\\HelloWorld.java")
file.apply { setReadable(true)
}.apply { setReadOnly()
}

由于apply函数能返回原对象,所以也支持链式调用。以上代码在功能作用上完全等价。

let函数

属于匿名函数类型,提供了函数式API的编程接口,将原始对象作为参数传递到表达Lamba表达式中,在闭包范围内用it指代原对象,我们还是通过实例来加深理解,先来一段简单函数:

val list = listOf(1, 2, 3, 4, 5, 6)
val first = list.first()
println(first+first)

代码不难理解,可预见输出结果为:

image.gif
再用let函数形式编写如下:

val result = listOf(1, 2, 3, 4, 5, 6).let {it.first()+it.first()
}
println("let结果为$result")

对应输出结果为:

image.gif
可见,let函数所返回的对象,是在函数中运行完的对象,即let函数的返回类型是根据匿名函数最后一行的变化而变化的,这是跟apply函数的一个区别,apply函数返回的永远是函数本身。例如我们添加些apply的代码,如下:

fun main(){val result = listOf(1, 2, 3, 4, 5, 6).let {it.first()+it.first()}val result2 = listOf(1, 2, 3, 4, 5, 6).apply {this.first()+this.first()}println("let结果为$result")println("apply结果为$result2")
}

对应输出结果为:

image.gif

总结

在这里我们对两个函数总结一下:

apply

1、函数返回的类型都是原泛型对象本身;

2、函数内部持有的是this,原对象本身。

Let

1、let函数所返回的对象,是在函数中运行完的对象,即let函数的返回类型是根据匿名函数最后一行的变化而变化的;

2、函数内部持有的是it。

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

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

相关文章

redis的AOF

redis 提供了两种持久化方式—— RDB(Redis DataBase) 和 AOF(Append Only File) ,可以将 Redis 在内存中的数据库状态保存到磁盘里。 RDB快照并不是很可靠。如果服务器突然宕机了,最新的数据就会丢失。除了 RDB 持久化功能之外,Redis 还提供…

大语言模型之LlaMA系列- LlaMA 2及LLaMA2_chat(上)

LlaMA 2是一个经过预训练与微调的基于自回归的transformer的LLMs,参数从7B至70B。同期推出的Llama 2-Chat是Llama 2专门为对话领域微调的模型。 在许多开放的基准测试中Llama 2-Chat优于其他开源的聊天模型,此外Llama 2-Chat还做了可用性与安全性评估。 …

Docker应用之Nginx安装(二)

目录 一、拉取nginx镜像二、在宿主机中创建挂载目录三、将配置文件放到挂载目录四、创建容器并启动 五、总结 一、拉取nginx镜像 docker pull nginx 二、在宿主机中创建挂载目录 mkdir -p /data/nginx/{conf,conf.d,html,log} 三、将配置文件放到挂载目录 在/data/nginx/…

阅读笔记7:Molecular mechanisms of ovulation: co-ordination through the CC

Molecular mechanisms of ovulation: co-ordination through the cumulus complex 作者:Darryl L. Russell, Rebecca L. Robker 发表期刊:Human Reproduction Update 发表时间:22 January 2007 排卵的分子机制:通过卵丘复合体的协调 摘要部分 研究背景:成功的排卵需要在适…

CKS1.28【1】kube-bench 修复不安全项

Context 针对 kubeadm 创建的 cluster 运行 CIS 基准测试工具时,发现了多个必须立即解决的问题。 Task 通过配置修复所有问题并重新启动受影响的组件以确保新的设置生效。 修复针对 API 服务器发现的所有以下违规行为: 1.2.7 Ensure that the --authoriz…

JVM技术文档-Arthas--线上内存问题定位

阿丹: 记录一次线上问题的定位,以及解释和讲解一下在docker容器中arthas的使用。 arthas使用文档: 我先给官方的文档放在这里,在文章中我使用的代码和解释我也会写,但是针对于每个人遇到的情况不一样,我这…

HiveSQL题——array_contains函数

目录 一、原创文章被引用次数 0 问题描述 1 数据准备 2 数据分析 ​编辑 3 小结 二、学生退费人数 0 问题描述 1 数据准备 2 数据分析 3 小结 一、原创文章被引用次数 0 问题描述 求原创文章被引用的次数,注意本题不能用关联的形式求解。 1 数据准备 i…

OpenCV 13 - 图像对比度和亮度的调节基本阈值操作

1 图像阈值 图像阈值是一种图像处理技术,用于将图像转换为二值图像。通过设定一个阈值,将图像中的像素值与阈值进行比较,将大于或小于阈值的像素分别设置为不同的像素值,从而实现图像的二值化处理。 2 阈值类型 2-1 阈值类型-阈值二值化(threshold binary) 2-2 阈值类型…

学习Android的第一天

目录 什么是 Android? Android 官网 Android 应用程序 Android 开发环境搭建 Android 平台架构 Android 应用程序组件 附件组件 Android 第一个程序 HelloWorld 什么是 Android? Android(发音为[ˈnˌdrɔɪd],非官方中文…

vue3 源码解析(6)— lifecycle 生命周期的实现

前言 对于 vue3 的生命周期,我们经常性会去疑问,生命周期有哪些呢,它是怎么去实现的, 又是什么时候调用的。 vue3 生命周期有哪些 下面这个表格列出了所有选项式api生命周期钩子和组合式api生命周期钩子,以及他们的…

GPT-4 Turbo 128k免费玩!字节跳动「Coze 扣子」AI Bot平台,零门槛打造你的专属聊天机器人,飞书、微信任你发布!

想要一个智能聊天助手,却苦于没有技术背景?别担心,字节跳动的“Coze扣子”AI Bot开发平台为你解忧!无需编程知识,你也能快速搭建个性化的AI聊天机器人。 更厉害的是,“Coze扣子”不仅支持国内用户独享的云…

通过大疆PSDK,将第三方摄像头的视频流推到M300遥控器显示

1.首先确保跑通了大疆官方的demo,demo功能是可以将本地h264的视频文件推到遥控器显示。 2.将264格式设置为普通264(默认为大疆264),更改demo里的代码如下 //returnCode DjiPayloadCamera_SetVideoStreamType(DJI_CAMERA_VIDEO_S…

《云原生安全攻防》-- 云原生安全概述

从本节课程开始,我们将正式踏上云原生安全的学习之旅。在深入探讨云原生安全的相关概念之前,让我们先对云原生有一个全面的认识。 什么是云原生呢? 云原生(Cloud Native)是一个组合词,我们把它拆分为云和原生两个词来…

Arduino 推出基于乐鑫 ESP32-S3 的 STEM 教育机器人

Arduino Alvik 是 Arduino Education 推出的一款新型机器人,可作为一种跨学科工具,为当前教育和未来机器人世界筑起连接的桥梁。Hackster 的 Gareth Halfacree 表示:“Alvik 的设计灵感来自 Arduino 简化复杂技术的理念,同时它也 …

【Spring Boot 3】事件机制

【Spring Boot 3】事件机制 背景介绍开发环境开发步骤及源码工程目录结构总结背景 软件开发是一门实践性科学,对大多数人来说,学习一种新技术不是一开始就去深究其原理,而是先从做出一个可工作的DEMO入手。但在我个人学习和工作经历中,每次学习新技术总是要花费或多或少的…

css实现按钮边框旋转

先上效果图 本质&#xff1a;一个矩形在两个矩形互相重叠遮盖形成的缝隙中旋转形成&#xff0c;注意css属性z-index层级关系 直接上代码 <div class"bg"><div class"button">按钮</div></div><style>.bg {width: 100%;heigh…

C++从零开始的打怪升级之路(day27)

这是关于一个普通双非本科大一学生的C的学习记录贴 在此前&#xff0c;我学了一点点C语言还有简单的数据结构&#xff0c;如果有小伙伴想和我一起学习的&#xff0c;可以私信我交流分享学习资料 那么开启正题 今天分享的是关于vector&#xff0c;这篇博客内容紧跟上一篇 1.…

80.如何评估一台服务器能承受的最大TCP连接数

文章目录 一、一个服务端进程最多能支持多少条 TCP 连接&#xff1f;二、一台服务器最大最多能支持多少条 TCP 连接&#xff1f;三、总结 一个服务端进程最大能支持多少条 TCP 连接&#xff1f; 一台服务器最大能支持多少条 TCP 连接&#xff1f; 很多朋友可能第一反应就是端…

【pytorch】anaconda使用及安装pytorch

https://zhuanlan.zhihu.com/p/348120084 https://blog.csdn.net/weixin_44110563/article/details/123324304 介绍 Conda创建环境相当于创建一个虚拟的空间将这些包都装在这个位置&#xff0c;不需要了可以直接打包放入垃圾箱&#xff0c;同时也可以针对不同程序的运行环境选…

有趣的css - 动态的毛玻璃背景

页面效果 此效果主要使用 backdrop-filter 属性&#xff0c;以及配合 animation 属性来实现毛玻璃模糊和一些动效。 此效果可适用于登录窗口&#xff0c;网站背景或者一些卡片列表中&#xff0c;使网页更具科技感和空间感。 核心代码部分&#xff0c;简要说明了写法思路&#x…