kotlin中缀调用和析构声明

中缀调用

实现中缀调用必须满足下面三个条件:

该函数必须为成员函数或者扩展函数
必须只有一个参数
使用infix关键字修饰

fun main(args: Array<String>) {
    val map = mapOf(1 to "one", 2 to "two")
    map.map(::println)
}
//result:
1=one
2=two

这val map = mapOf(1 to "one", 2 to "two")里的to就是一个infix function。其源码实现:

public infix fun <A, B> A.to(that: B): Pair<A, B> = Pair(this, that) 

调用方式有两种:
  1.to("one"):常规调用方式
  1 to "one:中缀表示法调用
自己定义中缀调用

infix fun Int.add(x: Int): Int {
    return this + x
}

fun main(args: Array<String>) {
    // 中缀操作符可以这样调用
    println(1 add 2)
    // 等价于
    println(1.add(2))
}

析构声明

在Kotlin语言中,可以通过析构声明单独提取某个对象中的某些字段。看一个例子:

data class Person(var id: Int, var age: Int, var name: String) 

fun main(args: Array<String>) {
    val person = Person(1, 28, "Scott Smith")
    val (id, age, name) = person
    println(name)
}

析构声明从一定程度上减少了一些样板代码的编写,更令人惊喜的是,它还可以用在循环和map,甚至lambda表达式中:

data class Person(var id: Int, var age: Int, var name: String)

fun func(init: (id: Int, name: String) -> Unit) {
    init(1, "Scott Smith")
}

fun main(args: Array<String>) {
    val person = Person(1, 28, "Scott Smith")
    val list = arrayListOf<Person>(person)
    for ((id, _, name) in list) {
        println("$id : $name")
    }


    val map = mapOf("k1" to "v1", "k2" to "v2")
    for ((key, value) in map) {
        println("$key : $value")
    }

    func { a, b ->
        println("$a : $b")
    }
}

注意:如果要对非数据类进行析构处理,你需要手动实现componentN系列函数。这里,我们依然以Person类为例。如果Person是一个非数据类,为了正确析构,你必须这样做:

class Person(var id: Int, var age: Int, var name: String) {
    operator fun component1(): Int {
        return id
    }

    operator fun component2(): Int {
        return age
    }

    operator fun component3(): String {
        return name
    }
}
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容