《Kotlin核心编程》 ——2.2.3 var的适用场景

举报
华章计算机 发表于 2020/02/21 20:25:52 2020/02/21
【摘要】 本节书摘来自华章计算机《Kotlin核心编程》 —— 书中第2章,第2.2.3节,作者是水滴技术团队 。

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是其更加适合的实现方案。


【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。