为什么我可以在Kotlin中不传递参数名称的情况下调用乐趣?

Hel*_*oCW 1 android kotlin

在函数joinToString中有4个带默认值的参数,在我看来,当我省略参数名时我应该按顺序传递参数值.

所以我认为守则 println(letters.joinToString( transform={ it.toLowerCase() } ) )是对的.

但实际上守则println(letters.joinToString { it.toLowerCase() } ) 也是对的,为什么呢?

fun <T> Collection<T>.joinToString(
        separator: String = ", ",
        prefix: String = "",
        postfix: String = "",
        transform: (T) -> String = { it.toString() }
): String {
    val result = StringBuilder(prefix)

    for ((index, element) in this.withIndex()) {
        if (index > 0) result.append(separator)
        result.append(transform(element))
    }

    result.append(postfix)
    return result.toString()
}


fun main(args: Array<String>) {  
    val letters = listOf("Alpha", "Beta")

    println(letters.joinToString { it.toLowerCase() } )               //It's Ok    
    println(letters.joinToString( transform={ it.toLowerCase() } ) )  //It's OK

}
Run Code Online (Sandbox Code Playgroud)

小智 6

因为您使用的是不同的语法.

如果方法的最后一个参数是方法引用,那么您可以省略括号并使用{括号传递函数.

it在这种情况下变成T你传入函数

println(letters.joinToString { it.toLowerCase() } )
Run Code Online (Sandbox Code Playgroud)

以下是您认为进入的内容.这不会编译,并且需要命名参数或params的顺序正确.您还必须将语法从使用更改it为使用常规功能语法

println(letters.joinToString(it.toLowerCase()))
Run Code Online (Sandbox Code Playgroud)