中缀调用
实现中缀调用必须满足下面三个条件:
该函数必须为成员函数或者扩展函数
必须只有一个参数
使用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
}
}