文章目录
1 函数参数
1.1 命名参数
fun main() {
val list = arrayListOf(1, 2, 3)
val result = joinToString(list, ";", "(", ")")
println(result)
}
fun <T> joinToString(
collection: Collection<T>,
separator: String,
prefix: String,
postfix: String
): String {
val result = StringBuilder(prefix)
for ((index, element) in collection.withIndex()) {
if (index > 0)
result.append(separator)
result.append(element)
}
result.append(postfix)
return result.toString()
}
传统的方法,无法分清到底是哪个参数,只能依赖IDE提示。
joinToString(list, /*separator*/";", /*prefix*/"(", /*postfix*/")")
Java中可以通过注释来指示这个参数的含义,或者通过enum枚举类型的名称来区分
在Kotlin中则可以通过命名参数来达到这个目的
joinToString(list, separator = ";", prefix = "(", postfix = ")")
指定该参数是赋给哪个形参的
1.2 参数默认值
Kotlin中的函数支持设置参数默认值,拥有默认值的参数可以不用传参而使用默认值,也可以传参来覆盖默认值。
像上面的函数, 如果前缀和后缀只是偶尔需要改变,则可以使用默认参数
fun <T> joinToString(
collection: Collection<T>,
separator: String = ";",
prefix: String = "(",
postfix: String = ")"
): String {
...}
val result = joinToString(list)
有了参数默认值之后,可以选择其中的一些参数进行赋值
val result = joinToString(list, prefix = "[")
其他的使用默认值
参数默认值只能从右往左相连的参数,否则还是需要提供显示的参数,因为会产生歧义
fun <T> joinToString(
collection: Collection<T>,
separator: String = ";",
prefix: String,
postfix: String = ")"
): String
这样编译没有问题,但是第二个参数还是默认会给separator,所以这样跳着的设置默认参数没有意义,separator的默认参数无法生效
Java中没有参数默认值,怎么调用Kotlin中的有参数默认值的函数呢?
Java中调用,需要提供所有的参数
List list = List.