RxSwift操作符操作符map、flatMap、flatMapLatest、filter的使用与区别

简介: RxSwift操作符操作符map、flatMap、flatMapLatest、filter的使用与区别


01. Map

map操作符将源Observable的每个元素应用你提供的转换方法,然后返回含有转换结果的Observable

示例:将每一个元素X10以后,生成一个新的Observable, 并发出所有的元素;

func testMap() {
    let observable = Observable.of(1, 2, 3)
    let newObservable = observable.map { (value) -> Int in return value * 10 }
    newObservable.subscribe { (res) in
        Logger(res)
    }.disposed(by: disposeBag)
}

运行结果:

Log - next(10)
Log - next(20)
Log - next(30)
Log - completed


02. FlatMap

flatMap操作符将源Observable的每一个元素应用一个转换方法,将他们转换成Observables。然后将这些Observables的元素合并之后再发送出来;

示例:当Observable的元素本身拥有其他的Observable时,可以将所有子Observables的元素发送出来;

func testFlatMap() {
    let observable = BehaviorSubject<Int?>(value: 1)
    let parentObservable = BehaviorRelay<BehaviorSubject<Int?>>(value: observable)
    let newObservable = parentObservable.asObservable().flatMap { value -> BehaviorSubject<Int?> in
        return value
    }
    newObservable.subscribe { (res) in
        Logger(res)
    }.disposed(by: disposeBag)
    Logger("flatMap - ended - 以下代码为演示flatMapLatest做对比")
    let observable2 = BehaviorSubject<Int?>(value: 2)
    parentObservable.accept(observable2)
    observable.onNext(3)
}

运行结果:

Log - next(Optional(1))
Log - flatMap - ended - 以下代码为演示flatMapLatest做对比
Log - next(Optional(2))
Log - next(Optional(3))

MapFlatMap的联系:都可以对元素进行转换,并且返回结果都是Observable类型;

MapFlatMap的区别:flatMap针对的是将元素转换为Observable并且闭包的返回值必须是Observable;而map更加偏向于对每一个元素的处理,对元素进行操作,闭包的返回值可以是任意类型;


03. FlatMapLatest

flatMap类似,主要是将Observable的元素转换成其他的Observable,然后取这些Observables中最新的一个,具体是什么意思呢?看下面的示例:


func testflatMapLatest() {
    let observable = BehaviorSubject<Int?>(value: 1)
    let parentObservable = BehaviorRelay<BehaviorSubject<Int?>>(value: observable)
    let newObservable = parentObservable.asObservable().flatMapLatest { value -> BehaviorSubject<Int?> in
        return value
    }
    newObservable.subscribe { (res) in
        Logger(res)
    }.disposed(by: disposeBag)
    let observable2 = BehaviorSubject<Int?>(value: 2)
    parentObservable.accept(observable2)
    observable.onNext(3)
}

运行结果:



Log - next(Optional(1))
Log - next(Optional(2))

通过对比flatMap的运行结果Log下面的代码可以看出元素3当使用flatMapLatest转换的时候,这个信号并未发出,也就是说当parentObservable发出最新的元素的时候,flatMapLatest一旦转换出一个新的Observable,就只发出它的元素,旧的Observables的元素将被忽略掉,而flatMap是可以继续发出元素的;


04. Filter

仅仅发出Observable中通过判定的元素;


func testFilter() {
    let observable = Observable.of(1, 2, 3)
    let newObservable = observable.filter { (value) -> Bool in return value % 2 == 0 }
    newObservable.subscribe { (res) in
        Logger(res)
    }.disposed(by: disposeBag)
}

运行结果:



Log - next(2)
Log - completed

filtermap的区别可简单理解为,map是对元素的按照一定规则进行转换,filter则是对元素的筛选,取出符合条件的元素,并发出;

相关文章
WK
|
15天前
map和filter的区别是什么
在编程中,`map` 和 `filter` 是处理数组或集合时常用的两个函数。`map` 用于将每个元素通过指定函数转换后生成新的数组,而 `filter` 则根据条件筛选出符合条件的元素组成新数组。两者的主要区别在于:`map` 的返回数组长度与原数组相同,但元素被转换;`filter` 的返回数组长度可能不同,只包含符合条件的元素。
WK
12 2
|
22天前
|
JavaScript 前端开发 索引
JS中常用的数组迭代方法(filter,forEach,map,every,some,find,findIndex)
这段代码和说明介绍了JavaScript中数组的一些常用方法。函数接收三个参数:`item`(数组项的值)、`index`(项的位置,可选)和`array`(数组本身,可选)。示例展示了如何使用`filter()`过滤非空项、`forEach()`遍历数组、`map()`处理并返回新数组、`every()`检查所有元素是否满足条件、`some()`检查是否存在满足条件的元素、`find()`获取首个符合条件的元素值以及`findIndex()`获取其索引位置。这些方法都不会修改原数组。
JS中常用的数组迭代方法(filter,forEach,map,every,some,find,findIndex)
|
24天前
|
存储 算法 Java
Go 通过 Map/Filter/ForEach 等流式 API 高效处理数据
Go 通过 Map/Filter/ForEach 等流式 API 高效处理数据
|
30天前
|
Java
【Java集合类面试二十二】、Map和Set有什么区别?
该CSDN博客文章讨论了Map和Set的区别,但提供的内容摘要并未直接解释这两种集合类型的差异。通常,Map是一种键值对集合,提供通过键快速检索值的能力,而Set是一个不允许重复元素的集合。
|
1月前
|
分布式计算 Serverless 数据处理
|
22天前
|
安全 Java API
Java 8 流库的魔法革命:Filter、Map、FlatMap 和 Optional 如何颠覆编程世界!
【8月更文挑战第29天】Java 8 的 Stream API 通过 Filter、Map、FlatMap 和 Optional 等操作,提供了高效、简洁的数据集合处理方式。Filter 用于筛选符合条件的元素;Map 对元素进行转换;FlatMap 将多个流扁平化合并;Optional 安全处理空值。这些操作结合使用,能够显著提升代码的可读性和简洁性,使数据处理更为高效和便捷。
28 0
|
2月前
|
人工智能 算法 大数据
算法金 | 推导式、生成器、向量化、map、filter、reduce、itertools,再见 for 循环
这篇内容介绍了编程中避免使用 for 循环的一些方法,特别是针对 Python 语言。它强调了 for 循环在处理大数据或复杂逻辑时可能导致的性能、可读性和复杂度问题。
39 6
算法金 | 推导式、生成器、向量化、map、filter、reduce、itertools,再见 for 循环
|
29天前
|
存储 Java 索引
|
1月前
|
分布式计算 Python
【python笔记】高阶函数map、filter、reduce
【python笔记】高阶函数map、filter、reduce
|
2月前
|
JavaScript API
js【最佳实践】遍历数组的八种方法(含数组遍历 API 的对比)for,forEach,for of,map,filter,reduce,every,some
js【最佳实践】遍历数组的八种方法(含数组遍历 API 的对比)for,forEach,for of,map,filter,reduce,every,some
55 1