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

【Kotlin 集合概述】可变参数vararg、中缀函数infix以及解构声明(二十)

导读大纲

    • 1.1 使用集合: vararg、infix 调用和解构声明
      • 1.1.1 扩展 Java 集合 API
      • 1.1.2 vararg: 接受任意数量参数的函数
      • 1.1.3 处理pairs: Infix 调用和解构声明

1.1 使用集合: vararg、infix 调用和解构声明

  1. 本节将介绍 Kotlin 标准库中用于处理集合的一些函数

  2. 同时,还介绍一些相关的语言特性(主要涉及以下三大特性)

    • vararg 关键字允许你声明一个包含任意数量参数的函数
    • infix 中缀函数, 可让您在调用某些单参数函数时更加简单
    • 解构声明(Destructuring declarations)可将单个复合值解包为多个变量

1.1.1 扩展 Java 集合 API

  1. 我们认为 Kotlin 中的集合是与 Java 中相同的类,但具有扩展的 API
    • 比如,这里的获取列表中最后一个元素计算数字集合之和
fun main() {val strings: List<String> = listOf("first", "second", "fourteenth")strings.last()// fourteenthval numbers: Collection<Int> = setOf(1, 14, 2)numbers.sum()// 17
}
  1. 为什么在 Kotlin 中,尽管集合是 Java 库类的实例,却可以用集合做很多事情
    • 现在,答案应该很清楚: last 和 sum 函数被声明为扩展函数
      1. 关于扩展函数和扩展属性以及顶级函数与顶级属性前面已经讲过,这里不再赘述
        • 顶级函数和顶级属性
        • 扩展函数系列
      2. 学习扩展函数时,我曾说过,定义的扩展函数必须导入到当前文件才会生效
        • 这里无需导入是因为集合相关的扩展函数总是默认导入到你的 Kotlin 文件
    • last函数是 List 类的扩展,这里的T是泛型的类型参数,可以先不用理会
      1. 这个扩展的实现很简单,应该都能看懂
      2. 比如在扩展函数中调用this.isEmpty(),this指代的是List的实例对象,可以省略
        title
    • sum函数只针对Iterable类型,简单说就是只有元素是Int类型的迭代对象可以调用该方法
      title
public fun <T> List<T>.last(): T {if (isEmpty())throw NoSuchElementException("List is empty.")return this[lastIndex]
}
@kotlin.jvm.JvmName("sumOfInt")
public fun Iterable<Int>.sum(): Int {var sum: Int = 0for (element in this) {sum += element}return sum
}

1.1.2 vararg: 接受任意数量参数的函数

  1. 调用函数创建列表时,可以传递任意数量的参数
    • 如果在标准库中查找该函数的声明方式,会发现其签名如下
      1. fun listOf(vararg values: T): List { /* implementation */ }
        title
val list = listOf(235711)
  1. 这种方法利用一种语言特性: vararg
    • 将任意数量的值打包到数组然后传递给方法
    • <1> Kotlin 的 vararg 与 Java 中的可变参数类似,但语法略有不同
      1. Kotlin 在参数上使用 vararg 修饰符
      2. 而 Java 是在类型后面加上三个点
// 在Kotlin中
fun main() {val strings: List<String> = listOf("first", "second", "fourteenth")  // <1>strings.last()
}
// 在Java中
public class Example {public static void Test (String  ...args) {                         // <1>System.out.println(Arrays.toString(args));}public static void main(String[] args){Test("1", "2", "3");}
}
  1. Kotlin 和 Java 的另一个不同之处在于
    • 需要传递的参数已经打包在数组中时,调用函数的语法
    • 在Java中,可以原封不动地传递数组, 而Kotlin则要求显式地解包数组
      1. 以便每个数组元素都成为被调用函数的单独参数
      2. wtf,这不就是Python的*args,对, 没错
    • <1> 这一功能被称为展开运算符,使用它直接在相应参数前加上"*"字符
      1. 这里"展开"args数组(其中包含传递给main函数的命令行参数)
        • 将其用作 listOf 函数的可变参数
    • <2> 展开运算符可将数组中的值与一些其他值组合起来
      1. Java 中不支持这种操作,这就是最大的不同点
fun main(args: Array<String>) {val list = listOf("args: ", *args)       // <1>println(list)val extraArgs = listOf("hello", *args)   // <2>println(extraArgs)
}

1.1.3 处理pairs: Infix 调用和解构声明

  1. 之前学习集合的简单创建时, 讲过可以使用 mapOf 函数
    • <1> to 并不是内置结构,而是一种特殊的方法调用,即 infix 调用
      1. 如果小伙伴记性不错,应该记得之前for循环迭代整数时使用过"100 downTo 1"语法
      2. 没戳,infix fun Int.downTo(to: Int) 也是一个中缀函数,即使用infix修饰符的函数
        title
val map = mapOf(1 to "one", 7 to "seven", 53 to "fifty-three")  // <1>
  1. 在 infix 调用
    • 方法名紧接在目标对象名和参数之间, 没有额外的分隔符
    • <1> 以下两个调用是等价的
      1. 第一个是按常规方式调用函数
      2. 第二个使用infix简洁语法来调用函数
fun main(args: Array<String>) {println(1.to("one"))                // <1>println(1 to "one")                 // <1>
}
=============================
(1, one)
(1, one)
  1. 对于只有一个所需参数普通方法和扩展函数,可以使用 infix 调用
    • 要使用中缀简洁语法调用一个函数,需要用 infix 修饰符对其进行标记
    • <1> to 函数返回 Pair 的实例,Pair 是 Kotlin 标准库中的一个类
      1. Pair表示一对元素
        title
infix fun Any.to(other: Any) = Pair(this, other)   // <1>
  1. 请注意,您可以直接用一个 Pair 对象初始化两个变量
    • <1> 这一功能称为解构
      title
fun main(args: Array<String>) {val (number, name) = 1 to "one"    // <1>println("$number to $name")      
}
  1. 解构功能并不局限于Pair对象
    • 例如, 也可以用 map entry来初始化 key 和 value 这两个变量
    • <1> 这也适用于循环,正如在实现joinToString时使用的 withIndex 函数
      1. 这里解构声明的作用就在于不用额外定义一个 index 变量
        • 通过迭代时自增来跟踪当前元素的索引值
      2. 解构出来的index本身就代表当前元素的索引
for ((index, element) in collection.withIndex()) {   // <1>println("$index: $element")
}
  1. to 函数是一个扩展函数, 可以创建一对任意元素
    • 这意味着它是通用接收器的扩展:
      1. 可以编写 1 to “one”, “one” to 1, list to list.size(),以此类推
    • <1> 看看 mapOf 函数的实际签名, 与 listOf 类似
      1. mapOf也接受可变参数,但这次参数是键值对(Pair<K, V>)
    • 尽管在 Kotlin 中创建一个新的 map 看起来像是一个特殊的结构
      1. 但它却是一个infix语法的常规函数,Kotlin的简洁性也算是初露锋芒
// <1>
public fun <K, V> mapOf(vararg pairs: Pair<K, V>): Map<K, V> =if (pairs.size > 0) pairs.toMap(LinkedHashMap(mapCapacity(pairs.size))) else emptyMap()

相关文章:

【Kotlin 集合概述】可变参数vararg、中缀函数infix以及解构声明(二十)

导读大纲 1.1 使用集合: vararg、infix 调用和解构声明1.1.1 扩展 Java 集合 API1.1.2 vararg: 接受任意数量参数的函数1.1.3 处理pairs: Infix 调用和解构声明 1.1 使用集合: vararg、infix 调用和解构声明 本节将介绍 Kotlin 标准库中用于处理集合的一些函数 同时,还介绍一些…...

unity安装报错问题记录

unity安装报错问题记录 今天下载了unity&#xff0c;一路安装下来&#xff0c;遇到了两个问题&#xff1a; Microsoft Visual Studio Community 2022 Install failed: Validation Failed 查询资料提到本机已安装&#xff0c;实际本机未安装。 解决了半天&#xff0c;大致有…...

秋招|面试|群面|求职

秋招|面试|群面|求职 自我介绍30s-1min&#xff0c;首先是清楚的介绍自己的名字/专业等个人信息&#xff0c;面试岗位&#xff0c;也可以介绍一下对于岗位的理解。然后介绍一下过往经历中最亮眼的几点&#xff0c;主要是为了突出和岗位的适配程度。群面&#xff0c;我觉得最重…...

【Kubernetes】日志平台EFK+Logstash+Kafka【理论】

一&#xff0c;日志处理方案 方案一&#xff0c;【EFK】&#xff1a;Elasticsearch Fluentd&#xff08;或Filebeat&#xff09; Kibana Elasticsearch&#xff08;简称&#xff1a;ES&#xff09;&#xff1a;实时&#xff0c;分布式存储&#xff0c;可扩展&#xff0c;日…...

基于SpringBoot+Vue+MySQL的教学资料管理系统

系统展示 管理员后台界面 教师后台界面 系统背景 在当今信息化高速发展的时代&#xff0c;教育机构面临着日益增长的教学资料管理需求。为了提升教学管理的效率&#xff0c;优化资源的配置与利用&#xff0c;开发一套高效、便捷的教学资料管理系统显得尤为重要。基于SpringBoot…...

动态规划day45:编辑距离|115. 不同的子序列、583. 两个字符串的删除操作、72. 编辑距离(动规终极好题)

动态规划day45:编辑距离|115. 不同的子序列、583. 两个字符串的删除操作、72. 编辑距离(动规终极好题&#xff09; 115. 不同的子序列583. 两个字符串的删除操作72. 编辑距离(动规终极好题) 115. 不同的子序列 给你两个字符串 s 和 t &#xff0c;统计并返回在 s 的 子序列 中…...

剑指 offer 刷题集

目录 数组 1. LCR 121. 寻找目标值 - 二维数组 2. LCR 120. 寻找文件副本 3. LCR 128. 库存管理 I 4. LCR 131. 砍竹子 I 5. LCR 132. 砍竹子 II 6. LCR 135. 报数 7. LCR 139. 训练计划 I 8. LCR 158. 库存管理 II 9. LCR 159. 库存管理 III 10. LCR 160. 数据流中…...

C++在线开发环境搭建(WEBIDE)

C在线开发环境搭建 一、环境说明1.1 系统基础环境说明1.1 docker-ce社区版安装 二、codeserver构建2.1 构建codeserver环境的docker容器2.2 构建docker镜像2.3 运行docker2.4 运行展示 三、构建codeserver中的c开发环境3.1 插件下载3.2 插件安装 四、其他知识4.2 code-server配…...

重磅首发!大语言模型LLM学习路线图来了!

ChatGPT的出现在全球掀起了AI大模型的浪潮&#xff0c;2023年可以被称为AI元年&#xff0c;AI大模型以一种野蛮的方式&#xff0c;闯入你我的生活之中。 从问答对话到辅助编程&#xff0c;从图画解析到自主创作&#xff0c;AI所展现出来的能力&#xff0c;超出了多数人的预料&…...

neo4j关系的创建删除 图的删除

关系的创建和删除 关系创建 CREATE (:Person {name:"jack"})-[:LOVE]->(:Person {name:"Rose"})已有这个关系时&#xff0c;merge不起效果 MERGE (:Person {name:"Jack" })-[:LOVE]->(:Person {name:"Rose"})关系兼顾节点和关…...

【WRF运行第三期】服务器上运行WRF模型(官网案例-Hurricane Matthew)

【WRF运行第三期】运行WRF模型&#xff08;官网案例-Hurricane Matthew&#xff09; 官网案例-Hurricane Matthew介绍0 创建DATA文件夹1 WPS预处理1.1 解压GRIB数据&#xff08;ungrib.exe&#xff09;1.1.1 解压GRIB数据---GFS&#xff08;Matthew案例研究数据&#xff09;1.1…...

基于springboot的书店图书销售管理系统的设计与实现 (含源码+sql+视频导入教程)

&#x1f449;文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1 、功能描述 基于springboot的书店图书销售管理系统拥有三个角色 管理员&#xff1a;用户管理、角色管理、权限管理、店铺管理等商家&#xff1a;图书管理、上架图书、访问量统计、销售总额统计、订单…...

Spring MVC 基本配置步骤 总结

1.简介 本文记录Spring MVC基本项目拉起配置步骤。 2.步骤 在pom.xml中导入依赖&#xff1a; <dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>6.0.6</version><scope>…...

HCIP--以太网交换安全(一)

以太网交换安全概述&#xff1a;以太网交换安全是一系列技术和策略的集合&#xff0c;旨在保护以太网交换机免受各种网络攻击和威胁。 端口隔离 一、端口隔离概述&#xff1a; 作用&#xff1a;可以实现同一个VLAN内端口的隔离 优势&#xff1a; 端口隔离功能为用户提供了更…...

PyQt5中关于QLineEdit的空输入报错的简单处理

PyQt5中关于QLineEdit的空输入报错的简单处理 前言分析原因解决办法总结 前言 在PyQt5的界面中对于数据的输入&#xff0c;最常用的就是QLineEdit控件&#xff0c;该控件作为基本的数据输入控件已经能满足我们的简单使用。在使用过程&#xff0c;出现闪退情况&#xff0c;发现…...

【前端】ES12:ES12新特性

文章目录 1 逻辑赋值操作符2 数字分隔符3 replaceAll4 Promise.any5 WeakRef6 FinalizationRegistry 1 逻辑赋值操作符 逻辑赋值操作符 ??、&&、 ||。 let a true let b false //a && b //false a || b ; //true console.log(a)let obj {name:"ker…...

语音识别(非实时)

1.环境 python &#xff1a;3.10.14 2.完整代码 import whisper #whisper import wave # 使用wave库可读、写wav类型的音频文件 import pyaudio # 使用pyaudio库可以进行录音&#xff0c;播放&#xff0c;生成wav文件 def record(time): # 录音程序# 定义数据流块CHUNK …...

【计算机网络】--URL统一资源定位符

一个网站地址实例 scheme://host.domain:port/path/filename scheme——定义因特网服务的类型&#xff0c;常见的类型是http host——定义域主机&#xff08;http的默认主机是www&#xff09; domain———定义因特网的域名&#xff0c;例如&#xff0c;jinyun.fun &#xf…...

在成都建“圈”五年,鲲鹏让智能化新风吹遍巴蜀大地

科技圈里流行着“互联网四大中心”的说法&#xff0c;即南边的深圳、东边的杭州、北边的北京和西边的成都。 深圳、杭州、北京几乎没有太大的争议&#xff0c;这里是国内著名的互联网公司聚集地&#xff0c;有着国内排行前三的互联网企业总部&#xff0c;单单一个北京西二旗就…...

Unity图形用户界面!*★,°*:.☆( ̄▽ ̄)/$:*.°★* 。(万字解析)

Unity 3D GUI 简介 游戏开发过程中&#xff0c;开发人员往往会通过制作大量的图形用户界面&#xff08; Graphical User Interface&#xff0c;GUI &#xff09;来增强游戏与玩家的交互性。 Unity 3D 中的图形系统分为 OnGUI、NGUI、UGUI等&#xff0c;这些类型的图形系统内容…...

为什么你的Java车载模块在-40℃冷启动失败?温度敏感型JIT编译失效分析与AOT预编译加固方案(ISO 26262 Part 6实证)

第一章&#xff1a;Java车载系统实时性优化技巧在车载嵌入式环境中&#xff0c;Java虚拟机&#xff08;JVM&#xff09;的默认行为往往难以满足毫秒级响应、确定性调度与低抖动等硬实时需求。尽管Java并非传统实时语言&#xff0c;但通过深度配置与架构约束&#xff0c;可显著提…...

Phi-3-mini-128k-instruct与智能车仿真:生成自然语言控制逻辑与调试报告

Phi-3-mini-128k-instruct与智能车仿真&#xff1a;生成自然语言控制逻辑与调试报告 最近在折腾一个智能车仿真项目&#xff0c;发现一个挺有意思的事儿&#xff1a;让AI来帮忙写控制逻辑和看报告&#xff0c;效率提升了不少。以前我们得手动把“绕过前面那个障碍物&#xff0…...

深度解析:关系型数据库与非关系型数据库(区别+原理+适用场景,一文吃透)

在后端开发、数据存储领域&#xff0c;“关系型数据库&#xff08;SQL&#xff09;”和“非关系型数据库&#xff08;NoSQL&#xff09;”是两个绕不开的核心概念。很多开发者在选型时会困惑&#xff1a;到底该用MySQL还是MongoDB&#xff1f;PostgreSQL和Redis的区别是什么&am…...

重庆银行:万亿新贵的高光与隐忧

对于重庆银行而言&#xff0c;2026年3月24日是一个值得载入史册的日子。就在这一天&#xff0c;该行正式发布了2025年年度报告&#xff0c;其资产规模突破以往周期&#xff0c;使其成功跻身“万亿级城商行俱乐部”。其中&#xff0c;该行的营收与净利润时隔五年再次实现了“双十…...

MQTT.fx连接阿里云物联网平台全流程指南(含密码生成工具推荐)

MQTT.fx连接阿里云物联网平台全流程指南&#xff08;含密码生成工具推荐&#xff09; 物联网开发者在初次尝试将设备接入阿里云物联网平台时&#xff0c;往往会遇到各种连接问题。作为最受欢迎的MQTT客户端工具之一&#xff0c;MQTT.fx因其简洁直观的界面和强大的功能&#xf…...

当LLM学会“思考”算法逻辑:拆解EoH如何用“思想+代码”协同进化,碾压传统自动设计

当LLM成为算法设计师&#xff1a;揭秘EoH如何用“思维代码”双螺旋进化重塑自动算法设计 想象一下&#xff0c;你正在指挥一支由建筑师和施工队组成的特殊团队。建筑师负责绘制蓝图&#xff0c;施工队负责将蓝图变为现实。但与传统团队不同&#xff0c;你的建筑师能根据施工反…...

Python AOT编译迎来分水岭:2026年3大工业级工具实测对比(启动提速8.7×,内存降63%,兼容CPython 3.13+)

第一章&#xff1a;Python AOT编译的范式跃迁与工业落地元年定义长期以来&#xff0c;Python 以解释执行和动态特性见长&#xff0c;但其运行时开销、启动延迟与内存 footprint 成为云原生服务、边缘设备与实时系统规模化部署的关键瓶颈。2024 年&#xff0c;随着 Nuitka 14.x、…...

手把手教你优化SiC MOSFET模块:从铜带键合到双面散热的5个关键技术

SiC MOSFET功率模块封装优化实战&#xff1a;五大关键技术深度解析 在电力电子领域&#xff0c;碳化硅(SiC)MOSFET功率模块正逐步取代传统硅基IGBT&#xff0c;成为高效率、高功率密度应用的首选。然而&#xff0c;要充分发挥SiC材料的性能优势&#xff0c;封装技术面临前所未…...

少样本学习实战指南:从数据增强到多模态融合的5个关键技巧

少样本学习实战指南&#xff1a;从数据增强到多模态融合的5个关键技巧 在工业质检和医疗影像等实际场景中&#xff0c;数据稀缺问题长期困扰着机器学习工程师。传统深度学习模型需要海量标注数据&#xff0c;而现实情况往往是每个类别仅有几个样本可用。这种少样本学习&#xf…...

Phi-3 Forest Laboratory 与SpringBoot微服务整合:打造企业级AI中台

Phi-3 Forest Laboratory 与SpringBoot微服务整合&#xff1a;打造企业级AI中台 最近和几个做企业级应用开发的朋友聊天&#xff0c;大家不约而同地提到了同一个痛点&#xff1a;公司内部有好几个业务团队都想用上最新的AI能力&#xff0c;比如用Phi-3这样的模型做智能客服、文…...