Scala 2.12中如何对Array[Double]两两求和计算核心CPU负载
简洁优雅的Scala实现方案
嘿,刚接触Scala的话,它的集合API绝对能帮你写出比循环+var优雅得多的代码!针对你把逻辑处理器负载两两相邻求和得到物理核心负载的需求,这里有几种简洁的实现方式:
最直观的分组求和法
Scala的数组(其实所有TraversableOnce类型)都自带grouped(n)方法,它能把集合分成大小为n的连续分组。正好我们需要两两一组,直接用这个方法再求和就行:
val perCoreLoads: Array[Double] = logicalProcessorLoads .grouped(2) // 将数组分成相邻的两两一组,比如示例数组会分成[12.4,2.2], [10.0,5.0]等 .map(_.sum) // 对每组的两个元素求和 .toArray // 把结果转换回Array[Double]类型
这个写法完全是函数式风格,没有可变变量,代码清晰易懂,完美匹配你的需求。
滑动窗口替代方案
如果你想换一种思路,也可以用sliding(size, step)方法,把步长设为2,效果和grouped(2)完全一致:
val perCoreLoads: Array[Double] = logicalProcessorLoads .sliding(2, 2) // 滑动窗口大小为2,每次移动2步,等价于两两分组 .map(_.sum) .toArray
手动配对(适合理解逻辑)
如果想更明确地看到“偶数索引和奇数索引配对”的逻辑,还可以用splitAt+zip的组合:
// 把数组分成前半段(偶数位置的逻辑处理器)和后半段(奇数位置的逻辑处理器) val (firstHalf, secondHalf) = logicalProcessorLoads.splitAt(logicalProcessorLoads.length / 2) // 两两配对后求和 val perCoreLoads: Array[Double] = firstHalf.zip(secondHalf).map { case (a, b) => a + b }
不过这种写法不如前两种简洁,更适合用来理解配对的底层逻辑。
对比你原来的实现,这些方法都避免了使用可变变量和手动索引操作,不仅代码更短,还消除了索引越界的潜在风险(当然题目里数组长度肯定是偶数,但函数式写法本身更安全)。
内容的提问来源于stack exchange,提问作者hotmeatballsoup
相关产品推荐
相关产品推荐

