告白:我再也不想用一种非垃圾收集的语言工作了。 我用像C ++这样的语言缴纳了多年的会费,而且我不想放弃现代语言的便利性。 这就是软件开发如何进行的故事。 我们构建抽象层来处理(并隐藏)世俗的细节。 随着计算机功能的增长,我们将更多的任务转移给了语言和运行时。 十年前,开发人员回避了解释型语言,因为它们对生产应用程序来说太慢了,但现在已经很普遍了。 功能语言的许多功能在十年前就已经令人望而却步地慢了下来,但现在变得非常有意义了,因为它们优化了开发人员的时间和精力。
我在本系列文章中介绍的许多功能都显示了功能语言和框架如何处理世俗的细节。 但是,您不必使用功能语言即可开始从功能构造中受益。 在本期以及下期中,我将展示一些函数式编程如何已经渗透到Groovy中。
Groovy的功能性清单
Groovy大大增强了Java集合库,包括添加功能构造。 Groovy为您提供的第一个好处是在列表上提供了不同的视角,乍一看似乎微不足道,但提供了一些有趣的好处。
看到列表的方式不同
如果您的背景主要是使用C或类似C的语言(包括Java),则您可能会将列表概念化为索引集合。 即使没有显式使用索引,这种观点也使遍历一个集合变得容易,如清单1所示,它们是Groovy代码:
清单1.使用(隐藏)索引的列表遍历
def perfectNumbers = [6, 28, 496, 8128]
def iterateList(listOfNums) {
listOfNums.each { n ->
println "${n}"
}
}
iterateList(perfectNumbers)
Groovy还包括一个eachWithIndex()
迭代器,该迭代器在需要显式访问的情况下将索引作为代码块的参数提供。 即使我没有在清单1的iteraterList()
方法中使用索引,我仍然将其视为插槽的有序集合,如图1所示:
图1.列表作为索引槽
![列表作为索引槽的图示](https://i-blog.csdnimg.cn/blog_migrate/25fa07ad68346b5df23264ab3e4d77b3.png)
许多函数式语言在列表上的观点略有不同,幸运的是Groovy拥有这种观点。 与其将列表视为带索引的插槽,不如将其视为列表中第一个元素(标头 )和列表其余部分( 尾部 )的组合,如图2所示: