《Kotlin核心编程》 ——2.2.3 var的适用场景
2.2.3 var的适用场景
一个可能被提及的问题是:既然val这么好,那么为什么Kotlin还要保留var呢?
事实上,从Kotlin诞生的那一刻就决定了必须拥抱var,因为它兼容Java。除此之外,在某些场景使用var确实会起到不错的效果。举个例子,假设我们现在有一个整数列表,然后遍历元素操作后获得计算结果,如下:
fun cal(list: List<Int>): Int {
var res = 0
for (el in list) {
res *= el
res += el
}
return res
}
这是我们非常熟悉的做法,以上代码中的res是个局部的可变变量,它与外界没有任何交互,非常安全可控。我们再来尝试用val实现:
fun cal(list: List<Int>): Int {
fun recurse(listr: List<Int>, res: Int): Int {
if (listr.size > 0) {
val el = listr.first()
return recurse(listr.drop(1), res * el + el)
} else {
return res
}
}
return recurse(list, 0)
}
这就有点尴尬了,必须利用递归才能实现,原本非常简单的逻辑现在变得非常不直观。当然,熟悉Kotlin的朋友可能知道List有一个fold方法,可以实现一个更加精简的版本。
fun cal(list: List<Int>): Int {
return list.fold(0) { res, el -> res * el + el }
}
函数式API果然拥有极强的表达能力。
可见,在诸如以上的场合下,用var声明一个局部变量可以让程序的表达显得直接、易于理解。这种例子很多,即使是Kotlin的源码实现,尤其集合类遍历的实现方法,也大量使用了var。之所以采用这种命令式风格,而不是更简洁的函数式实现,一个很大的原因是因为var的方案有更好的性能,占用内存更少。所以,尤其针对数据结构,可能在业务中需要存储大量的数据,所以显然采用var是其更加适合的实现方案。
- 点赞
- 收藏
- 关注作者
评论(0)