kotlin中缀调用和析构声明

中缀调用

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

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

fun main(args: Array) {
    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.to(that: B): Pair = Pair(this, that) 

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

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

fun main(args: Array) {
    // 中缀操作符可以这样调用
    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) {
    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) {
    val person = Person(1, 28, "Scott Smith")
    val list = arrayListOf(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
    }
}

你可能感兴趣的:(kotlin中缀调用和析构声明)