You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swift 4.1中使用compactMap替代lazy集合的flatMap是否等效?

解答:Swift中用lazy+compactMap替代弃用的flatMap是否等效

当然可以!你完全可以用compactMap替代原来被弃用的flatMap来过滤集合中的nil元素,结合lazy后的行为、性能表现和之前的写法完全一致。

为什么会有这个替换?

在Swift 4.1之前,flatMap承担了两个语义不同的功能:

  • 一是将嵌套的序列“拍平”(比如把[[Int]]转换为[Int]);
  • 二是过滤集合中的nil元素并自动解包可选值。

为了避免语义混淆,Swift官方把第二个功能单独拆分出来,命名为compactMap,而处理序列拍平的flatMap则保留了下来。

替换后的代码示例

把你原来的flatMap换成compactMap即可,代码如下:

let optionalIntegers : [Int?] = [1, 2, nil, 3, 4, nil, nil, 5]
optionalIntegers.lazy.compactMap { $0 }.forEach { print("Item \($0 * 10)") }

运行这段代码会输出和原代码完全相同的结果:

Item 10
Item 20
Item 30
Item 40
Item 50

关于lazy的效果

加上lazy之后,依然保持延迟计算的特性:不会提前生成完整的非可选整数数组,而是在forEach遍历过程中逐个处理元素(解包、过滤),内存占用和原写法一致,性能没有差异,非常适合处理大型集合。

小补充

如果需要处理嵌套序列的拍平操作(比如[[1,2], [3,4]] → [1,2,3,4]),直接使用原来的flatMap即可,这个功能并没有被弃用哦~

内容的提问来源于stack exchange,提问作者Roman Podymov

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 06:57:05