题目
使用函数式编程实现整数列表的过滤与转换
信息
- 类型:问答
- 难度:⭐
考点
高阶函数,不可变性,集合操作
快速回答
使用 Scala 函数式编程处理整数列表的步骤如下:
- 使用
filter筛选出偶数 - 使用
map将每个元素乘以 2 - 使用
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 | ❌ 使用了可变变量(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