Kotlin-神奇的下划线字符(_)

时间:2021-09-22 20:07:07

提起下划线字符(_),最熟悉的莫过于命名名称时,使用下划线作为一个单词的分隔符,比如,btn_login。但,在Kotlin中,却赋予下滑线神奇的魔法,先不说下划线的作用。这里有一个这样的想法:在某些情况下,我们所声明的函数中,比如lambda表达式或者解构声明中的所以参数,并不是所有的参数都可以用到。我们总是想着将用不到的不作声明,那么就需要一种方法来省略这些参数。

在Kotlin中,可以使用一个下划线字符(_)作为lambda或表达式函数的参数的名称,或作为解构条目的名称。

作为lambda函数的参数名称

之前,我们已经熟练使用,解构声明语法为lambda表达式传递参数,所以我们可以这么做:

fun main(args: Array<String>) {

val aa = mapOf(1 to "a",2 to "B")

aa.forEach { key, value -> println("value:$value")
}

在上述示例中,只是用到了value值,key并没有用到。这样,我们就想不在声明key,那么就需要使用下划线字符(_)作为key替代,即:

fun main(args: Array<String>) {

val aa = mapOf(1 to "a",2 to "B")

aa.forEach { _, value -> println("value:$value")
}

作为解构声明的参数

解构声明就是将一个对象解构(destructure)为多个变量,也就是意味着一个解构声明会一次性创建多个变量。尽管这样很方便,但是,如果用不到的变量必然也必须得声明,从而造成了变量的冗余。对于解构声明不了解的,可参考:Kotlin-解构声明

之前,通过解构声明创建多个变量时,我们这么做:

fun main(args: Array<String>) {

val book = Book(1, "英语")
val (id, name) = book
}

data class Book(var id: Int, var name: String)

上面的示例中,解构book声明了 id,name两个变量。如果只需要id这一个变量时,可以这么做:

val book = Book(1, "英语")
val (id, _) = book

数字字面值中的下划线

对于来说大家都很熟悉了,由11位数字组成,也就是13XXXXXXXXX。这样看一串数字,总觉得别扭。如果可以3-4-4这样的方式显示,其值为13X XXXX XXXX,最好不过了。

现在,Kotlin的数字面值可以使用下划线来分隔数值进行分组:

val oneMillion = 1_000_000
val hexBytes = 0xFF_EC_DE_5E
val bytes = 0b11010010_01101001_10010100_10010010

fun main(args: Array<String>) {

// Log: 1000000
println(oneMillion)

// Log: ffecde5e
println(hexBytes.toString(16))

// Log: 11010010011010011001010010010010
println(bytes.toString(2))
}