《kotlin实战》学习总结(2)函数的定义与调用

函数的定义和调用

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
//可以使用as关键字来修改导入的类或函数名称
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()
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值