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,一经查实,立即删除!

相关文章

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

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

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],非官方中文…

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

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

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

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

css实现按钮边框旋转

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

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…

【Docker】使用VS创建、运行、打包、部署.net core 6.0 webapi

欢迎来到《小5讲堂》&#xff0c;大家好&#xff0c;我是全栈小5。 这是《Docker容器》系列文章&#xff0c;每篇文章将以博主理解的角度展开讲解&#xff0c; 特别是针对知识点的概念进行叙说&#xff0c;大部分文章将会对这些概念进行实际例子验证&#xff0c;以此达到加深对…

应用智能家居领域中的低功耗蓝牙模块

智能家居&#xff08;smart home, home automation&#xff09;是以住宅为平台&#xff0c;利用综合布线技术、网络通信技术、 安全防范技术、自动控制技术、音视频技术将家居生活有关的设施集成&#xff0c;构建高效的住宅设施与家庭日程事务的管理系统&#xff0c;提升家居安…

MySQL for update锁表还是锁行校验

select * from user where id 1 for update ; 1. for update作用 在MySQL中&#xff0c;使用for update子句可以对查询结果集进行行级锁定&#xff0c;以便在事务中对这些行进行更新或者防止其他事务对这些行进行修改。 当使用for update时&#xff0c;锁定行的方式取决于wh…

AI 智能体:探索自主智能的世界

AI 智能体&#xff1a;探索自主智能的世界 认真的飞速小软 飞速创软 2024-01-30 11:06 发表于新加坡 想象一下&#xff0c;在这样一个世界里&#xff0c;软件自身可以自主地与环境交互&#xff0c;根据收集的数据做出决策&#xff0c;并以最少的人工干预来执行任务。这些AI智能…

2024美赛C题全网最早思路 网球运动(持续更新)

2024美赛已经于今天早上6点准时公布题目。本次美赛将全程跟大家一起战斗冲刺O奖&#xff01;思路持续更新。 2024 MCM Problem C: Momentum in Tennis &#xff08;网球运动的势头&#xff09; 注&#xff1a;在网球运动中&#xff0c;"势头"通常指的是比赛中因一系…

数据分析基础之《pandas(3)—DataFrame运算》

一、算术运算 1、add() 加法运算 2、sub() 减法运算 3、想要得到每天的涨跌幅大小&#xff0c;求出每天close-open价格差 # 算术运算 close data[close] open1 data[open] # 收盘价减去开盘价 data[m_price_change] close.sub(open1) data.head() 二、逻辑运算 1、逻辑…

2024 美国大学生数学建模竞赛 美赛(C题)网球比赛趋势问题 国际大学生数学建模竞赛| 建模秘籍文章代码思路大全

铛铛&#xff01;小秘籍来咯&#xff01; 小秘籍希望大家都能轻松建模呀&#xff0c;华数杯也会持续给大家放送思路滴~ 抓紧小秘籍&#xff0c;我们出发吧~ 完整内容可以在文章末尾领取&#xff01; 问题1 • 开发一个模型&#xff0c;捕捉到比赛进行时点的流动&#xff0c;…

three.js CSS3DRenderer、CSS3DSprite渲染HTML标签

有空的老铁关注一下我的抖音&#xff1a; 效果: <template><div><el-container><el-main><div class"box-card-left"><div id"threejs" style"border: 1px solid red;position: relative;"></div><…