现在你已经知道了如何创建一个集合,现在我们做点别的,打印它的内容。
我们先动手写一个集合toString(),我们自定义它的输出格式。
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()
}
val list = arrayListOf(1, 7, 53)
println(joinToString(list, ";", "[", "]"))
正常会打印 【1;7;53】
3.2.1 命名参数
增加函数的可读性
举例
println(joinToString(list, ";", "[", "]"))
如果不去看函数声明,看不出每个参数所代表的含义
在Kotlin中,可以做的很优雅
println(joinToString(list, separator = ";", prefix = "[", postfix = "]"))
当调用一个Kotlin定义的函数时,可以显式的标明一些参数的名称。如果在调用一个函数时,指定了一个参数的名称,为避免混淆,那它之后的所有参数都要标明参数名称。
3.2.2 默认参数值
Java的另一个普遍存在的问题是,一些类的重载函数实在太多了,缺点是重复,这些参数名和类型重复了一遍又一遍。与此同时,当你调用一个省略了部分参数的重载函数,你可能搞不清楚他们到底是哪一个。
在Kotlin中,可以在声明函数的时候,指定参数的默认值,这样可以避免创建重载函数
尝试改进前面的joinToString函数,设置默认值
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()
}
可以这样调用
println(joinToString(list))
println(joinToString(list, separator = ";"))
println(joinToString(list, separator = ";", prefix = "["))
3.2.3 消除静态工具类:顶层函数和套餐
我们知道Java作为一门面向对象的语言,所有的代码都要写作类的函数。但事实上,几乎所有的大型项目,最终都有很多的代码并不能归属到任何一个类中。有时存在一个基本对象,但你不想通过实例函数来添加操作,让它的API继续膨胀。
结果就是,最终这些类将不包含的状态或者实例函数,而是仅仅作为一堆静态函数的容器。在JDK中,最适合的例子应该就是Collections了。看看你自己的代码,是不是也有一些类本身就以Util作为后缀名。
在Kotlin中很笨就不需要去创建这些毫无意义的类。相反,可以把这些函数直接放到代码文件的顶层,不用从属于任何的类,这些放在文件顶层的函数依然是包内的成员,如果你需要从包外访问它,则需要import,但不再需要额外包一层。
让我们把joinToString直接放到strings包中试试。
package strings
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()
}
使用的时候导包即可
import strings.joinToString
顶层属性
和函数一样,属性也可以放到文件的顶层。在一个类的外面保存单独的数据片段,虽然不常用,但还是有它的价值。
参考《Kotlin》