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
}
答案 0 :(得分:6)
因为您使用的是其他语法。
如果方法的最后一个参数是方法引用,则可以省略括号,而只需在函数中加上{括号。
在这种情况下, it
变成您正在传递给函数的T
println(letters.joinToString { it.toLowerCase() } )
以下是您认为要输入的内容。这将无法编译,并且需要命名的参数或参数的顺序正确。您还必须将语法从使用it
更改为使用常规函数语法
println(letters.joinToString(it.toLowerCase()))
答案 1 :(得分:0)
除了@Dan的答案外,您无需提供命名参数,但是如果这样做,则您将不得不对以下所有参数(来自documentation)使用命名参数: “所有位置参数都应放在第一个命名参数之前”)。在您的情况下,您要提供的唯一命名参数是最后一个,其他所有参数都具有默认值,因此只要默认值适合您,就不必强迫提供它们。