中綴調(diào)用
實(shí)現(xiàn)中綴調(diào)用必須滿足下面三個條件:
該函數(shù)必須為成員函數(shù)或者擴(kuò)展函數(shù)
必須只有一個參數(shù)
使用infix關(guān)鍵字修飾
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饼记。其源碼實(shí)現(xiàn):
public infix fun <A, B> A.to(that: B): Pair<A, B> = Pair(this, that)
調(diào)用方式有兩種:
1.to("one"):常規(guī)調(diào)用方式
1 to "one:中綴表示法調(diào)用
自己定義中綴調(diào)用
infix fun Int.add(x: Int): Int {
return this + x
}
fun main(args: Array<String>) {
// 中綴操作符可以這樣調(diào)用
println(1 add 2)
// 等價于
println(1.add(2))
}
析構(gòu)聲明
在Kotlin語言中艺挪,可以通過析構(gòu)聲明單獨(dú)提取某個對象中的某些字段蔚晨“遄#看一個例子:
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)
}
析構(gòu)聲明從一定程度上減少了一些樣板代碼的編寫,更令人驚喜的是甥桂,它還可以用在循環(huán)和map柿究,甚至lambda表達(dá)式中:
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")
}
}
注意:如果要對非數(shù)據(jù)類進(jìn)行析構(gòu)處理,你需要手動實(shí)現(xiàn)componentN系列函數(shù)黄选。這里蝇摸,我們依然以Person類為例。如果Person是一個非數(shù)據(jù)類办陷,為了正確析構(gòu)貌夕,你必須這樣做:
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
}
}