侧边栏壁纸
博主头像
colo

欲买桂花同载酒

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

使用函数式编程实现整数列表的过滤与转换

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

题目

使用函数式编程实现整数列表的过滤与转换

信息

  • 类型:问答
  • 难度:⭐

考点

高阶函数,不可变性,集合操作

快速回答

使用 Scala 函数式编程处理整数列表的步骤如下:

  1. 使用 filter 筛选出偶数
  2. 使用 map 将每个元素乘以 2
  3. 使用 sum 计算最终结果

示例代码:
val result = list.filter(_ % 2 == 0).map(_ * 2).sum

解析

问题描述

给定一个整数列表 List(1, 2, 3, 4, 5, 6),要求:
1. 过滤出所有偶数
2. 将每个偶数乘以 2
3. 计算最终结果的总和

原理说明

Scala 函数式编程核心思想:

  • 不可变性:原始数据不修改,每次操作生成新集合
  • 高阶函数:函数可作为参数或返回值(如 filter, map
  • 链式调用:通过组合操作实现复杂逻辑

代码实现与说明

val numbers = List(1, 2, 3, 4, 5, 6)

// 函数式解决方案
val result = numbers
  .filter(n => n % 2 == 0)  // 步骤1:过滤偶数 → List(2,4,6)
  .map(n => n * 2)         // 步骤2:元素乘2 → List(4,8,12)
  .sum                     // 步骤3:求和 → 24

println(result)  // 输出: 24

最佳实践

  • 使用 占位符语法 简化代码:
    numbers.filter(_ % 2 == 0).map(_ * 2).sum
  • 优先选择 sum 而非 reduce(_+_),更简洁安全
  • 保持操作符单行链式调用,增强可读性

常见错误

错误示例问题分析
var total = 0
for (n <- numbers) {
if (n % 2 == 0) total += n * 2
}
❌ 使用了可变变量(var),违反函数式不可变原则
numbers.map(_ * 2).filter(_ % 2 == 0).sum❌ 操作顺序错误:先map会导致奇数也被计算,效率降低

扩展知识

  • 集合操作性能
    链式调用会创建中间集合,大数据集建议使用 view 延迟计算:
    numbers.view.filter(_ % 2 == 0).map(_ * 2).sum
  • 替代方案
    使用 collect 合并操作:
    numbers.collect { case n if n % 2 == 0 => n * 2 }.sum
  • 函数组合
    可定义独立函数组合使用:
    val doubleEven = (list: List[Int]) => list.filter(_ % 2 == 0).map(_ * 2)
    doubleEven(numbers).sum