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则是对元素的筛选,取出符合条件的元素,并发出;

相关文章
|
3月前
|
索引
ES5常见的数组方法:forEach ,map ,filter ,some ,every ,reduce (除了forEach,其他都有回调,都有return)
ES5常见的数组方法:forEach ,map ,filter ,some ,every ,reduce (除了forEach,其他都有回调,都有return)
|
2月前
|
存储 JavaScript 前端开发
Set、Map、WeakSet 和 WeakMap 的区别
在 JavaScript 中,Set 和 Map 用于存储唯一值和键值对,支持多种操作方法,如添加、删除和检查元素。WeakSet 和 WeakMap 则存储弱引用的对象,有助于防止内存泄漏,适合特定场景使用。
|
2月前
|
存储 缓存 Java
【用Java学习数据结构系列】HashMap与TreeMap的区别,以及Map与Set的关系
【用Java学习数据结构系列】HashMap与TreeMap的区别,以及Map与Set的关系
43 1
WK
|
3月前
|
Python
map和filter的区别是什么
`map()`和`filter()`均为Python中的高阶函数,前者针对可迭代对象中的每个元素执行指定操作,如数值翻倍或字符串转大写;后者则筛选出符合条件的元素,例如仅保留偶数或非空字符串。两者均返回迭代器,并可通过`list()`等函数转换为所需的数据结构。具体使用时,应依据实际需求和场景选择合适的函数。
WK
32 1
WK
|
3月前
map和filter的区别是什么
在编程中,`map` 和 `filter` 是处理数组或集合时常用的两个函数。`map` 用于将每个元素通过指定函数转换后生成新的数组,而 `filter` 则根据条件筛选出符合条件的元素组成新数组。两者的主要区别在于:`map` 的返回数组长度与原数组相同,但元素被转换;`filter` 的返回数组长度可能不同,只包含符合条件的元素。
WK
43 2
|
3月前
数组方法中的`forEach()`方法和`map()`方法有什么区别?
数组方法中的`forEach()`方法和`map()`方法有什么区别?
|
3月前
|
JavaScript 前端开发
JavaScript 中 五种迭代数组的方法 every some map filter forEach
本文介绍了JavaScript中五种常用数组迭代方法:every、some、filter、map和forEach,并通过示例代码展示了它们的基本用法和区别。
|
4月前
|
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)
|
4月前
|
存储 算法 Java
Go 通过 Map/Filter/ForEach 等流式 API 高效处理数据
Go 通过 Map/Filter/ForEach 等流式 API 高效处理数据
|
4月前
|
安全 Java API
Java 8 流库的魔法革命:Filter、Map、FlatMap 和 Optional 如何颠覆编程世界!
【8月更文挑战第29天】Java 8 的 Stream API 通过 Filter、Map、FlatMap 和 Optional 等操作,提供了高效、简洁的数据集合处理方式。Filter 用于筛选符合条件的元素;Map 对元素进行转换;FlatMap 将多个流扁平化合并;Optional 安全处理空值。这些操作结合使用,能够显著提升代码的可读性和简洁性,使数据处理更为高效和便捷。
157 0