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
相关产品推荐
相关产品推荐

