Kotlin3.4处理集合:可变参数、中缀调用和库的支持

  • 可变参数的关键字vararg,可以用来声明一个函数将可能有任意数量的参数
  • 一个中缀表示法,当你在调用一些只有一个参数的函数时,使用它会让代码更简练
  • 解构声明,用来把一个单独的组合值展开到多个变量中

3.4.1扩展Java集合的api

Kotlin中的集合与Java的类相同,但对api做了扩展。下面示例,获取列表中最后一个元素,找到数字集合中的最大值:

val strings = listOf("first", "second", "third")
strings.last()
>third
val numbers = setOf(1, 3, 2)
numbers.max()
>3

这里的last和max都被声明成了扩展函数。实现的方式都是很容易的。许多扩展函数在Kotlin标准库中都有声明,不需要每个都去了解,在使用的时候多看编译器的提示。

3.4.2可变参数:让函数支持任意数量的参数

在调用一个函数来创建列表的时候,可以传递任意个数的参数给它:

val strings = listOf("first", "second", "third")

在函数库中的声明:

public fun <T> listOf(vararg elements: T): List<T> = if (elements.size > 0) elements.asList() else emptyList()

Kotlin的可变参数与Java类似,但语法略有不同:Kotlin在该类型之后不会再使用三个点,而是在参数上使用vararg修饰符。
Kotlin和Java之间的另一个区别是,当需要传递的参数已经包装在数组中时,调用该函数的语法:
在Java中,可以按原样传递数组;
而Kotlin则要求显式地解包数组,以便每个数组元素在函数中能作为单独的参数来调用。
从技术的角度来讲,这个功能被称为展开运算符,而使用的时候,是在对应的参数前面加一个*

val list = listOf("args: ", *args)
println(list)

3.4.3键值对的处理:中缀调用和解构声明

可以使用mapOf函数来创建map:

val map = mapOf(1 to "one", 2 to "two", 3 to "three")

to不是内置的结构,而是一种特殊的函数调用,被称为中缀调用。
在中缀调用中,没有添加额外的分隔符,函数名称是直接放在目标对象名称和参数之间的。以下两种调用方式是等价的:

1.to("one")
1 to "one"

中缀调用可以与只有一个参数的函数一起使用,无论是普通的函数还是扩展函数。要允许使用中缀符号调用函数,需要使用infix修饰符来标记它。下面是一个简单的to函数声明:

infix fun Any.to(other: Any) = Pair(this, other)

to函数会返回一个Pair对象,Pair是Kotlin标准库中的类,它会用来表示一对元素。Pair和to的声明都用到了泛型,简单起见,这里省略了。
注意,可以直接用Pair的内容来初始化两个变量:

val (number, name) = 1 to "one"

这个功能称为解构声明。
解构声明特征不止用于pair。还可以使用map的key和value内容来初始化两个变量。
这也适用于循环,正如在withIndex函数的joinToString实现中:

 for ((index, element) in this.withIndex()) {
     println("$index: $element")
 }

to函数是一个扩展函数,可以创建一对任何元素,这意味着它是泛型接收者的扩展:可以使用1 to “one”、”one” to 1、等写法。

    原文作者:无心下棋
    原文地址: https://www.jianshu.com/p/a459e5cab779
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞