3-4.【函数式编程】如何使用 map + filter + reduce 组合实现统计字符串数组中长度大于3的单词字符总数?

1 阅读1分钟

假设有一个字符串数组:

let words = ["apple", "is", "good", "for", "health"]

目标:统计长度大于 3 的单词的字符总数


步骤分析

  1. 过滤长度大于 3 的单词filter
  2. 把每个单词映射成它的长度map
  3. 把长度累加起来reduce

实现代码

let totalLength = words
    .filter { $0.count > 3 }     // 过滤长度大于3的单词
    .map { $0.count }            // 映射为单词长度
    .reduce(0, +)                // 求和

print(totalLength) // 输出 15

解释

  1. filter { $0.count > 3 }

    • 过滤结果:["apple", "good", "health"]
  2. map { $0.count }

    • 映射结果:[5, 4, 6]
  3. reduce(0, +)

    • 求和结果:5 + 4 + 6 = 15

一行更简洁的写法(闭包内直接求长度)

let totalLength = words
    .filter { $0.count > 3 }
    .reduce(0) { $0 + $1.count }

print(totalLength) // 15
  • 这里直接用 reduce 来累加长度,不需要先 map
  • 对于小型操作,这种写法更高效。

总结

  • filter → 筛选符合条件的元素
  • map → 转换元素(比如取长度)
  • reduce → 聚合元素(比如求和、累积)