函数的定义和调用
1在kotlin中创建集合
val set = hashSetOf(1, 7, 53)
val list = arrayListOf(1, 7, 53)
val map = hashMapOf(1 to "one", 2 to "two", 3 to "three")
kotlin中的集合类型与java中完全一致,但kotlin新增了更多方法。
2 让函数更好调用
2.1 命名参数
当调用一个kotlin定义的函数时,可以显式地标明一些参数的名称。如果指明了一个参数的名称,那它之后的所有参数都需要标明名称(前面的参数不需要)
fun <T> joinToString(collection: Collection<T>,
separator: String,
prefix: String,
postfix: String): String{
}
joinToString(collection, separator = "separator", prefix = "prefix", postfix = "postfix")
需要注意的是当调用java的函数时不能使用命名参数。
2.2 默认参数值
为了解决java中重载函数过多的问题,在kotlin中,可以在声明函数的时候,指定参数的默认值,这样就可以避免创建重载的函数。
fun <T> joinToString(collection: Collection<T>,
separator: String = "sep",
prefix: String = "pre",
postfix: String): String = "pos"{
}
在使用时必须按照定义的参数顺序来给定参数,可以省略部分参数。如果使用命名参数,可以省略中间的一些参数,也可以按你想要的顺序给定你需要的参数。
2.3 消除静态工具类:顶层函数和属性
顶层函数
在java中几乎所有代码都写作类的函数,但几乎所有的大型项目,最终都有很多的代码不能归属到任何一个类里。结果就是,最终这些类将不包含任何的状态或者实例函数,而是仅仅作为一堆静态函数的容器。
在kotlin中根本不需要去创建这些无意义的类。相反,可以直接把这些函数放到代码文件的顶层,不用从属任何的类。这些放在文件顶层中的函数依然是包内的成员,如果能需要从包外访问它,则需要import。
顶层函数在编译时会编译为这个类的静态函数。
顶层属性
跟函数一样,属性也可以放到文件的顶层。在一个类的外面单独保存数据片段虽然不常用,但还是有它的价值。比如计算一些函数被执行的次数。
默认情况下顶层属性跟其他任何属性一样,是通过访问器暴露给java使用。如果你想要把一个常量以public static final的属性暴露给java,可以用const来修饰它。
3 给别人的类添加方法:扩展函数和属性
扩展函数就是一个定义在类外面的类成员函数。
fun String.addFun() = print(this.length)
和在类内部定义的方法不同的是,扩展函数不能访问私有的或者是受保护的成员。
3.1 导入和扩展函数
对于定义的扩展函数,它不会自动地在整个项目范围生效。相反,如果你要使用它,需要进行导入,就像其他类或者函数一样。这是为了避免偶然性的命名冲突。kotlin允许你像导入一个类一样来导入单个函数。
import String.addFun
import String.addFun as add
3.2 从java中调用扩展函数
扩展函数本质上还是静态函数,它只是把调用对象作为了它的第一个参数。调用扩展函数不会创建适配的对象或者任何运行时的额外消耗。
3.3 不可重写的扩展函数
扩展函数不可重写。扩展函数并不是类的一部分。如果父类和子类都定义了一个同名的扩展函数,会根据该变量的静态类型决定调用哪个,而不是变量的运行时变量。
3.4 扩展属性
val String.lastChar: Char
get() = get(length - 1);
print("kotlin".lastChar)
>>> n
注意,从java中访问扩展属性时应该显式地调用它的getter函数。
4 让你的代码更简洁:局部函数和扩展
为了减少重复的代码,kotlin允许在函数中再声明一个函数来调用。 局部函数可以直接访问外层函数的参数。
fun saveUser(user: User) {
fun validate(value: String){
if(value.isEmpty()
print("value is empty!)
}
validate(user.name)
validate(user.email)
}
4.1提取逻辑到扩展函数
扩展函数也可以被声明为局部函数。
fun User.validateBeforeSave() {
fun validate(value: String){
if(value.isEmpty()
print("value is empty!)
}
}
fun saveUser(user: User){
user.validateBeforeSave()
}
|