Kotlin-作用域函数
在对象的上下文中执行代码块。当您在提供lambda表达式的对象上调用这样的函数时,它会形成一个临时作用域。在此范围内,可以不带名称地访问对象。这样的函数称为作用域函数。
let run with apply also
作用域函数不会引入任何新的技术功能,但它们可以使代码更加简洁易读。
尽管作用域函数可以使代码更加简洁,但要避免过度使用它们:这会使代码难以阅读并导致错误。我们还建议避免嵌套作用域函数,并在链接它们时要小心,因为很容易混淆当前上下文对象和this或it的值。
对比
| 函数 | 对象引用 | 返回值 | 是否是扩展函数 |
|---|---|---|---|
| let | it | Lambda result | Yes |
| run | this | Lambda result | Yes |
| run | - | Lambda result | No:在没有上下文对象的情况下调用 |
| with | this | Lambda result | No:以上下文对象作为参数。是顶层函数 |
| apply | this | Context object(不会返回闭包结果) | Yes |
| also | it | Context object(不会返回闭包结果) | Yes |
let
可用于对调用链的结果调用一个或多个函数。例如,下面的代码打印一个集合上的两个操作的结果:
val numbers = mutableListOf("one", "two", "three", "four", "five")
val resultList = numbers.map { it.length }.filter { it > 3 }
println(resultList) val numbers = mutableListOf("one", "two", "three", "four", "five")
numbers.map { it.length }.filter { it > 3 }.let { println(it)// and more function calls if needed
}
Let通常用于执行包含非空值的代码块。要对非空对象执行操作,请使用安全调用运算符?。
val str: String? = "Hello"
//processNonNullString(str) // compilation error: str can be null
val length = str?.let { println("let() called on $it") processNonNullString(it) // OK: 'it' is not null inside '?.let { }'it.length
}
with
不能判空
建议在不需要使用返回结果时使用with来调用上下文对象上的函数。在代码中,with可读为“使用此对象,执行以下操作。”
val numbers = mutableListOf("one", "two", "three")
with(numbers) {println("'with' is called with argument $this")println("It contains $size elements")
}
run
Run的功能与with相同,但它是作为扩展函数实现的。
当你的lambda既初始化对象又计算返回值时,Run很有用。
val service = MultiportService("https://example.kotlinlang.org", 80)val result = service.run {port = 8080query(prepareRequest() + " to port $port")
}// the same code written with let() function:
val letResult = service.let {it.port = 8080it.query(it.prepareRequest() + " to port ${it.port}")
}
还可以将run作为非扩展函数调用。run的非扩展变体没有上下文对象,但它仍然返回lambda结果。非扩展运行允许您在需要表达式的地方执行由几个语句组成的块。
val hexNumberRegex = run {val digits = "0-9"val hexDigits = "A-Fa-f"val sign = "+-"Regex("[$sign]?[$digits$hexDigits]+")
}for (match in hexNumberRegex.findAll("+123 -FFFF !%*& 88 XYZ")) {println(match.value)
}
apply
建议您将它用于不返回值且主要操作receiver对象成员的代码块。apply最常见的用例是用于对象配置。这样的调用可以理解为“对对象应用下列赋值”。
val adam = Person("Adam").apply {age = 32city = "London"
}
println(adam)
apply的另一个用例是在多个调用链中包含apply,以进行更复杂的处理。
also
对于需要引用对象而不是其属性和函数的操作,或者当您不想从外部作用域遮挡this引用时,使用also。
当您在代码中看到also时,您可以将其读为“并且还对对象执行以下操作”。
val numbers = mutableListOf("one", "two", "three")
numbers.also { println("The list elements before adding new one: $it") }.add("four")
资料
https://kotlinlang.org/docs/scope-functions.html
相关文章:
Kotlin-作用域函数
在对象的上下文中执行代码块。当您在提供lambda表达式的对象上调用这样的函数时,它会形成一个临时作用域。在此范围内,可以不带名称地访问对象。这样的函数称为作用域函数。 let run with apply also 作用域函数不会引入任何新的技术功能,但它…...
QNX7.1 交叉编译开源库
1.下载QNX7.1 SDK并解压 ITL:~/work/tiqnx710$ ls -l 总用量 16 drwxrwxr-x 4 xxx4096 1月 28 13:38 host -rwxrwxr-x 1 xxx 972 1月 28 13:38 qnxsdp-env.bat -rwxrwxr-x 1 xxx 1676 1月 28 13:38 qnxsdp-env.sh drwxrwxr-x 3 xxx 4096 1月 28 13:38 target xxxITL:~/work/ti…...
论文投稿指南——中文核心期刊推荐(外国语言)
【前言】 🚀 想发论文怎么办?手把手教你论文如何投稿!那么,首先要搞懂投稿目标——论文期刊 🎄 在期刊论文的分布中,存在一种普遍现象:即对于某一特定的学科或专业来说,少数期刊所含…...
Fabric系列 - 链码-内部链码的特性
(1)Fabric repo下的案例 Chaincode(1.4的目录结构) fabric/examples/chaincode/go ├── example02 #一个简单的转账合约 ├── eventsender #发送事件通知 ├── passthru #调用其他链码(或者其他channel的链码)example02 (转账) 一个简单的转账合约。该链码简单实…...
NetApp SnapCenter 备份管理 ——借助应用程序一致的数据备份管理,简化混合云操作
NetApp SnapCenter 简单、可扩展、赋权:跨 Data Fabric 的企业级数据保护和克隆管理 主要优势 • 利用与应用程序集成的工作流和预定义策略简化备份、恢复和克隆管理。 • 借助基于存储的数据管理功能提高性能和可用性,并缩短测试和开发用时。 • 提供基…...
Java内置队列和高性能队列Disruptor
一、队列简介 队列是一种特殊的线性表,遵循先入先出、后入后出(FIFO)的基本原则,一般来说,它只允许在表的前端进行删除操作,而在表的后端进行插入操作,但是java的某些队列运行在任何地方插入删…...
比特数据结构与算法(第四章_下)二叉树的遍历
本章将会详细讲解二叉树遍历的四种方式,分别为前序遍历、中序遍历、后续遍历和层序遍历。在学习遍历之前,会先带大家回顾一下二叉树的基本概念。学习二叉树的基本操作前,需要先创建一颗二叉树,然后才能学习其相关的基本操作&#…...
chatGPT是什么
2022年11月,人工智能公司OpenAI推出了一款聊天机器人:ChatGPT。它能够通过学习和理解人类语言来进行对话,还能与聊天对象进行有逻辑的互动。除了聊天,ChatGPT还能够根据聊天对象提出的要求,进行文字翻译、文案撰写、代…...
jenkins漏洞集合
目录 CVE-2015-8103 反序列化远程代码执行 CVE-2016-0788 Jenkins CI和LTS 远程代码执行漏洞 CVE-2016-0792 低权限用户命令执行 CVE-2016-9299 代码执行 CVE-2017-1000353 Jenkins-CI 远程代码执行 CVE-2018-1000110 用户枚举 CVE-2018-1000861 远程命令执行 CVE-2018…...
用canvas画一个炫酷的粒子动画倒计时
前言 😆 这是一篇踩在活动尾声的文章,主要是之前在摸鱼社群里有人发了个粒子动画的特效视频,想着研究研究写一篇文章出来看看,结果这一下子就研究了半个多月。 😂 下面就把研究成果通过文字的形式展现出来吧…...
Java技术学习——Maven相关知识
一、什么是Maven? Maven是Apache软件基金会组织维护的一款专门为Java项目提供构建和依赖管理支持的工具。 1.1 构建 构建过程包含的主要环节如下: 清理:删除上一次构建的结果,为下一次构建做好准备编译:Java源程序…...
C++ 认识和了解C++
1.在使用C语言写代码的时候开头要用到的是: #include<iostream> using namespace std;不可以写成这样: #include iostream.h(1)iostream是输入输出流类, istream输入流类 cin >> ostream输出流类 cout &…...
u盘误删的文件怎么找回
u盘误删的文件怎么找回?u盘的特点之一就是极其便携,可以容纳各种格式的数据和文件,需要时可以直接使用。每次使用都会或多或少的存放一些文件,但有使用就会有删除,为了不影响使用性,清理存储空间是必要的。清理中如果…...
二分查找由浅入深--算法--java
二分查找写在开头算法前提:算法逻辑算法实现简单实现leftright可能超过int表示的最大限度代码分析和变换更多需求:求索引最小的值java二分API应用基础题思考难度方法写在开头 二分查找应该是算比较简单的这种算法了,我本以为还可以。但有时候…...
【学习】笔记本电脑重新安装系统win10
安装系统有很多方法: 软件安装制作启动u盘本文使用的方法就是启动盘安装: 1.首先下载iso镜像文件: msdn我告诉你:MSDN, 我告诉你 - 做一个安静的工具站 (itellyou.cn) 2.下载启动盘制作工具: 制作启动盘rufus:Rufus - 轻松创建 USB 启动盘 3.官网下载: https://do…...
RocketMQ的一些使用理解
1.RocketMQ的生产者生产负载策略(3种) (1)SelectMessageQueueByHash (一致性hash) (2)SelectMessageQueueByMachineRoom (机器随机) (3)SelectMessageQueueByRandom (随机) 第1种一…...
Java枚举详解
一.枚举 1.为什么有枚举? 如果我们的程序需要表示固定的几个值: 比如季节:spring (春),summer(夏),autumn(秋),winter(冬) 用常量表示: public static final int SEASON_SPRING 1;public st…...
虚拟机上安装openKylin详细步骤总结
一、创建虚拟机 首先获取操作系统安装镜像文件: 链接:https://pan.baidu.com/s/1tSuXmDk2ZILR4ieee6iImw?pwdcy47 提取码:cy47 (1-1)进入新虚拟机创建向导,选择“自定义”: (1-…...
夜天之书 #74 企业开源的软件协议模型实践(Part 2)
在上一篇文章中,我介绍了企业开源的完全开放源码策略及其风险。完全开放源码,即以符合开源定义的软件协议发布企业自研软件的情形。本文介绍应对完全开放源码后的风险的第一种策略:提高市场占有率与开放标准。与其说是策略,不如说…...
2.webpack实时打包
简介 上一章已经实现了使用 webpack 构建了一个简单的项目;但是我们发现,每次修改了 index.js 需要重新执行 cnpm run dev 命令重新构建 main.js;这在开发阶段是无法忍受的,因为这样调式将浪费大量的时间;还好 webpac…...
XU9232A可穿戴设备 电池供电设备 便携式医疗设备
这是一款高度集成的升压转换器,为输出高电压和高效率的应用方案而设计。输入电源可以从一个锂电池或二节串联的碱性电池,而升压到最高18V;工作频率为 1.2MHz(典型值)。内置典型4A开关晶体管,其组成 DC/DC 升…...
手把手教你用STM32实现BLDC电机的SPWM控制(附代码调试心得)
STM32实战:无刷直流电机SPWM控制全解析与代码优化指南 从理论到实践:BLDC电机控制的核心逻辑 第一次接触无刷直流电机(BLDC)控制时,我被它优雅的工作原理所吸引——没有电刷的火花和磨损,却能实现高效的能量转换。在工业自动化、无…...
Vial-QMK键盘固件从入门到精通:打造专属机械键盘体验
Vial-QMK键盘固件从入门到精通:打造专属机械键盘体验 【免费下载链接】vial-qmk QMK fork with Vial-specific features. 项目地址: https://gitcode.com/gh_mirrors/vi/vial-qmk Vial-QMK是一款功能强大的开源键盘固件,为机械键盘爱好者提供了全…...
IntelliJ IDEA终极教程:从零基础到高效开发的完整指南
IntelliJ IDEA终极教程:从零基础到高效开发的完整指南 【免费下载链接】IntelliJ-IDEA-Tutorial IntelliJ IDEA 简体中文专题教程 项目地址: https://gitcode.com/gh_mirrors/in/IntelliJ-IDEA-Tutorial IntelliJ IDEA 是目前所有 IDE 中最具备沉浸式的 JVM …...
3步搞定黑苹果配置:OpCore-Simplify让EFI构建效率提升80%的智能方案
3步搞定黑苹果配置:OpCore-Simplify让EFI构建效率提升80%的智能方案 【免费下载链接】OpCore-Simplify A tool designed to simplify the creation of OpenCore EFI 项目地址: https://gitcode.com/GitHub_Trending/op/OpCore-Simplify 你是否经历过这些痛苦…...
Iceoryx(冰羚):无锁队列与并发控制的设计与实现3(源码解析)
接上篇设计4: 索引管理层( MpmcIndexQueue / CyclicIndex)Subscriber存储数据使用的是queue,是为了保证数据的读取顺序。MpmcLockFreeQueue 为了满足多个进程同时写的情况,采用了索引数据分离的方案(底层的索引实现为 …...
从数组到哈夫曼树:用Python代码图解软考数据结构核心算法
从数组到哈夫曼树:Python实战软考核心数据结构 1. 线性结构的Python实现 1.1 顺序栈与队列的实现 Python的列表(list)天然适合实现顺序存储结构。我们先来看栈的实现: class ArrayStack:def __init__(self, capacity10):self._items []self._capacity …...
破解企业AI应用开发困境:Dify工作流架构的颠覆性价值
破解企业AI应用开发困境:Dify工作流架构的颠覆性价值 【免费下载链接】Awesome-Dify-Workflow 分享一些好用的 Dify DSL 工作流程,自用、学习两相宜。 Sharing some Dify workflows. 项目地址: https://gitcode.com/GitHub_Trending/aw/Awesome-Dify-W…...
安卓玩机神器:无需Root的“搞机工具箱”全功能解析与实战指南
1. 安卓玩机新选择:搞机工具箱为何成为神器? 最近在折腾安卓手机时,发现了一个宝藏工具——搞机工具箱。作为一个长期和安卓系统打交道的玩家,我试过各种需要Root权限的工具,但这款软件最让我惊喜的是它完全不需要Root…...
SDXL-Turbo在虚拟现实中的应用:实时环境生成技术
SDXL-Turbo在虚拟现实中的应用:实时环境生成技术 想象一下,在虚拟世界中每走一步,周围的景色就随之变化——茂密的森林在你眼前生长,古老的城堡在远处拔地而起,这一切都发生在眨眼之间。这不是魔法,而是SDX…...
