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

相关文章
|
2月前
|
Python
高阶函数如`map`, `filter`, `reduce`和`functools.partial`在Python中用于函数操作
【6月更文挑战第20天】高阶函数如`map`, `filter`, `reduce`和`functools.partial`在Python中用于函数操作。装饰器如`@timer`接收或返回函数,用于扩展功能,如记录执行时间。`timer`装饰器通过包裹函数并计算执行间隙展示时间消耗,如`my_function(2)`执行耗时2秒。
26 3
|
6天前
|
分布式计算 Serverless 数据处理
|
1月前
|
人工智能 算法 大数据
算法金 | 推导式、生成器、向量化、map、filter、reduce、itertools,再见 for 循环
这篇内容介绍了编程中避免使用 for 循环的一些方法,特别是针对 Python 语言。它强调了 for 循环在处理大数据或复杂逻辑时可能导致的性能、可读性和复杂度问题。
35 6
算法金 | 推导式、生成器、向量化、map、filter、reduce、itertools,再见 for 循环
|
12天前
|
分布式计算 Python
【python笔记】高阶函数map、filter、reduce
【python笔记】高阶函数map、filter、reduce
|
1月前
|
JavaScript API
js【最佳实践】遍历数组的八种方法(含数组遍历 API 的对比)for,forEach,for of,map,filter,reduce,every,some
js【最佳实践】遍历数组的八种方法(含数组遍历 API 的对比)for,forEach,for of,map,filter,reduce,every,some
39 1
|
2月前
|
Python
在Python中,`map()`, `filter()` 和 `reduce()` 是函数式编程中的三个核心高阶函数。
【6月更文挑战第24天】Python的`map()`应用函数到序列元素,返回新序列;`filter()`筛选满足条件的元素,生成新序列;`reduce()`累计操作序列元素,返回单一结果。
28 3
|
2月前
|
Java API 容器
Java 8 的流库:Filter、Map、FlatMap 及 Optional 的概念与用法
【6月更文挑战第9天】Java 8 引入了许多强大的新特性,其中流库(Stream API)和 Optional 类极大地简化了集合操作和空值处理。本文将深入探讨 filter、map、flatMap 以及 Optional 的概念和用法,并提供示例代码来展示其实际应用。
30 4
|
1月前
|
JSON JavaScript API
JS【详解】Map (含Map 和 Object 的区别,Map 的常用 API,Map与Object 的性能对比,Map 的应用场景和不适合的使用场景)
JS【详解】Map (含Map 和 Object 的区别,Map 的常用 API,Map与Object 的性能对比,Map 的应用场景和不适合的使用场景)
25 0
|
2月前
|
存储 安全 程序员
老程序员分享:List、Map、Set之间的联系与区别:
老程序员分享:List、Map、Set之间的联系与区别:
|
2月前
map::operator[] 底层大致介绍及与 map::insert() 区别
map::operator[] 底层大致介绍及与 map::insert() 区别