近期业务出现了一个需求,需要对一个相同实体的List中,部分实体名和id相同的元素进行合并,将其合并为一个实体,以便在业务上做统计处理,合并后的实体为合并前的实体的某些数值相加。
此需求催生了本篇文章。我们将抽象一个简单的实体来介绍,如何在Scala List 中合并部分Element 元素。
定义业务实体对象 MergeInfo
定义一个包含
name和收入数据的实体对象,当判断两个实体的name相同时,我们决定对其进行合并操作,将两个实体的fee进行累计,完成合并。
其中diff方法定义了当传入的target对象name与源对象的name相同时,返回true,否则返回false。
而merge操作则是当上一步diff返回true时,我们会采取的合并操作的具体逻辑。
1 | case class MergeInfo(name: String, fee: Double) { |
使用尾递归遍历 List 并进行合并
实体逻辑定义完成后,我们通过使用尾递归的模式来遍历给定的
List,
并使用matching pattern模式来进行合并前的判断和合并操作,
使用迭代器和累加器将遍历变为尾递归的形式,优化遍历的性能。
- 使用尾递归模式遍历 List,优化性能。
- 使用
matching pattern来判断和合并元素。 - 使用 隐式转换 特性,使使用此操作变得更为简单和优雅。
1 | object Utils { |
程序解释:
- in 输入的源List,待处理和合并。
- accum 累加器,每次遍历处理以此List中的元素,并将处理后的元素放入 accu 累加器中
x :: y :: ys这是Scala语法中对 List组成的一种描述, x,y 均为单个元素,ys 属于尾部,为剩余的 List元素。
测试程序
1 | /** |
运行测试类,结果如下:
1 | merge 前元素 size: 7, merge 后元素 size: 5 |
原文链接: https://www.317318.xyz/p/a8949b93.html
版权声明: 转载请注明出处.