题目
使用高阶函数计算列表中偶数的平方和
信息
- 类型:问答
- 难度:⭐
考点
高阶函数,匿名函数,集合操作
快速回答
使用Scala集合的高阶函数可以简洁实现:
- 用
filter筛选偶数 - 用
map计算平方 - 用
sum求和
示例代码:
val sum = list.filter(_ % 2 == 0).map(x => x * x).sum
## 解析
问题描述
给定一个整数列表,计算所有偶数的平方和。例如:输入List(1,2,3,4),输出20(因为2²+4²=4+16=20)。
原理说明
函数式编程的核心思想是无副作用和使用纯函数。Scala集合提供的高阶函数:
filter(p: A => Boolean):按条件筛选元素map(f: A => B):转换每个元素sum:对数值集合求和
完整解决方案
def sumOfEvenSquares(list: List[Int]): Int = {
list
.filter(x => x % 2 == 0) // 筛选偶数
.map(x => x * x) // 计算平方
.sum // 求和
}
// 测试
println(sumOfEvenSquares(List(1,2,3,4))) // 输出: 20最佳实践
- 链式调用:直接串联操作,避免中间变量
- 使用占位符:简写匿名函数,如
.filter(_ % 2 == 0) - 惰性求值:大数据集时可用
view优化性能:list.view.filter(_ % 2 == 0).map(x => x*x).sum
常见错误
- 忘记过滤:未先筛选偶数导致包含奇数结果
- 错误操作顺序:若先
map后filter会做多余计算 - 副作用操作:在
map/filter中修改外部变量(违反函数式原则)
扩展知识
- for推导式:等价实现方案
def sumOfEvenSquares(list: List[Int]): Int = { (for (x <- list if x % 2 == 0) yield x * x).sum } - collect方法:结合模式匹配
list.collect { case x if x % 2 == 0 => x * x }.sum - foldLeft:手动实现(理解原理)
list.foldLeft(0) { (acc, x) => if (x % 2 == 0) acc + x*x else acc }