首页 > 其他分享 >【Kotlin 集合概述】可变参数vararg、中缀函数infix以及解构声明(二十)

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

时间:2024-09-28 21:18:57浏览次数:9  
标签:函数 vararg Kotlin args 解构 fun 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()
    // fourteenth
    val 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 = 0
    for (element in this) {
        sum += element
    }
    return sum
}

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

  1. 调用函数创建列表时,可以传递任意数量的参数
    • 如果在标准库中查找该函数的声明方式,会发现其签名如下
      1. fun listOf(vararg values: T): List { /* implementation */ }
        title
val list = listOf(2、3、5、7、11)
  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()

标签:函数,vararg,Kotlin,args,解构,fun,infix,中缀
From: https://blog.csdn.net/qq_36154755/article/details/142579005

相关文章

  • javascript 数组对象解构
    传统的写法不好记忆,书写麻烦,此时可以使用结构赋值的方法让代码更加简洁。数组结构是将数组中的单元值快速批量赋值给一系列变量的简介语法。变量的顺序对应数组单元值位置一次进行赋值操作。如下:应用一:交换两个变量Js前面有那种情况需要加分号。(不加分号解析器认为和上......
  • 数据飞轮:解构数据技术的进阶之旅
    数据飞轮:解构数据技术的进阶之旅在这个数据驱动的时代,数据技术的演变改变了我们理解世界的方式。从数据仓库、数据中台到数据飞轮,每一次跳跃都不仅仅是技术的刷新,更是业务思维和战略执行的彻底革命。今天,我们将解构这一进化史,并结合具体的业务场景,探讨数据飞轮如何赋能产品优化和......
  • 解构数据飞轮:出行行业的智能化转型之路
    解构数据飞轮:出行行业的智能化转型之路在数据驱动的商业革新中,数据飞轮与数据中台两者之争似乎成为了业界热议的话题。在出行行业中,这一讨论尤为激烈,特别是当我们聚焦于智能推荐、用户活跃度、推荐爆款和增长分析等关键业务时。本文将浅析数据飞轮是否真的可以视为数据中台的高阶......
  • 数据飞轮时代的到来:解构数据中台的局限性
    随着科技的迅速进展,企业在数据管理和利用上的策略亦须不断进化。近年来,数据中台曾一度成为企业打造强大数据架构的黄金标准,然而,随着数据飞轮的兴起,数据中台似乎开始显露出其局限性。数据中台的核心理念在于集中数据资源,通过统一的数据管理和服务平台,支持企业的数据运营和分析决策。......
  • Vue3中如何响应式解构 props
    1、父组件<template><Children:count="count":info="info"/></template><scriptsetuplang="ts">import{ref,reactive}from"vue";importChildrenfrom"./Comp.vue";constcou......
  • 1、A+B(变量+数据类型+获取用户的输入(ACM)+解构赋值)
    总结:变量letvs.var:var现在用的比较少,现在常用letlet声明变量有以下几个注意点:变量只有声明之后才能使用。不允许重复声明变量const:声明常量,值不可修改consta=100;a=200;//报错也就意味着const值一旦声明就必须得立即初始化consta;//报错数据类型(JS分......
  • 函数参数的解构
    假设我在three.js中有一个项目,我需要一些几何图形,我将硬编码一个对象数组,其中包含它们的x、y和z值以及它们的宽度、高度和深度值,但是这个数组可能来自服务器或第三方api=>constgeometriesraw=[{color:0x44aa88,x:0,y:1,z:0,widt......
  • Vue3.5中解构props,让父子组件通信更加丝滑
    前言在Vue3.5版本中响应式Props解构终于正式转正了,这个功能之前一直是试验性的。这篇文章来带你搞清楚,一个String类型的props经过解构后明明应该是一个常量了,为什么还没丢失响应式呢?本文中使用的Vue版本为欧阳写文章时的最新版Vue3.5.5关注公众号:【前端欧阳】,给自己一个进阶vu......
  • Vue3.5+ 响应式 Props 解构
    你好同学,我是沐爸,欢迎点赞、收藏、评论和关注。在Vue3.5+中,响应式Props解构已经稳定并默认启用。这意味着在<scriptsetup>中从defineProps调用解构的变量现在是响应式的。这一改进大大简化了声明带有默认值的props的方式,并使得在子组件中直接使用解构后的pro......
  • 关于JS解构数据结构的表现形式
    对数组或对象类数据结构,尤其是复杂的JOSN数据结构,要从中取出想要的个别数据,往往会采用遍历方法进行,即麻烦又增加了运行时间。从ES6开始,JS增加了解构进行简化,本质上是打散复杂的数据结构,将其折分为更小的部分(复制出的小结构),从而使用数据更为方便快捷。一、对象解构1.单层对......