3.2 命名参数、顶层函数和属性

现在你已经知道了如何创建一个集合,现在我们做点别的,打印它的内容。

我们先动手写一个集合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》

猜你喜欢

转载自blog.csdn.net/cai784921129/article/details/81318663
3.2
今日推荐