- 可变参数的关键字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、等写法。
网友评论