美文网首页Android知识KotlinAndroid开发
Kotlin3.4处理集合:可变参数、中缀调用和库的支持

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

作者: 无心下棋 | 来源:发表于2018-05-23 21:18 被阅读26次
    • 可变参数的关键字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、等写法。

    相关文章

      网友评论

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

        本文链接:https://www.haomeiwen.com/subject/stpdjftx.html