侧边栏壁纸
博主头像
colo

欲买桂花同载酒

  • 累计撰写 1823 篇文章
  • 累计收到 0 条评论

使用高阶函数计算列表中偶数的平方和

2025-12-12 / 0 评论 / 4 阅读

题目

使用高阶函数计算列表中偶数的平方和

信息

  • 类型:问答
  • 难度:⭐

考点

高阶函数,匿名函数,集合操作

快速回答

使用Scala集合的高阶函数可以简洁实现:

  1. filter筛选偶数
  2. map计算平方
  3. 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

常见错误

  • 忘记过滤:未先筛选偶数导致包含奇数结果
  • 错误操作顺序:若先mapfilter会做多余计算
  • 副作用操作:在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
    }