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月前
|
存储 JavaScript 索引
js开发:请解释什么是ES6的Map和Set,以及它们与普通对象和数组的区别。
ES6引入了Map和Set数据结构。Map的键可以是任意类型且有序,与对象的字符串或符号键不同;Set存储唯一值,无重复。两者皆可迭代,支持for...of循环。Map有get、set、has、delete等方法,Set有add、delete、has方法。示例展示了Map和Set的基本操作。
40 3
|
2月前
|
JavaScript 前端开发 索引
问js的forEach和map的区别
JavaScript中的`forEach`和`map`都是数组迭代方法。`forEach`遍历数组但不修改原数组,无返回值;它接受回调函数处理元素。`map`则遍历数组并返回新数组,新数组元素为回调函数处理后的结果。两者都接收元素、索引和数组作为回调函数参数。
28 7
|
2月前
|
JavaScript 前端开发
解释 JavaScript 中的`map()`、`filter()`和`reduce()`方法的用途。
解释 JavaScript 中的`map()`、`filter()`和`reduce()`方法的用途。
30 1
|
2月前
|
开发者 Python
Python中的函数式编程:理解map、filter和reduce
【2月更文挑战第13天】 本文深入探讨了Python中函数式编程的三个主要工具:map、filter和reduce。我们将详细解释这些函数的工作原理,并通过实例来展示它们如何使代码更简洁、更易读。我们还将讨论一些常见的误解和陷阱,以及如何避免它们。无论你是Python新手还是有经验的开发者,本文都将帮助你更好地理解和使用这些强大的函数。
|
14天前
|
Python
高阶函数如`map`, `filter`, `reduce`和`functools.partial`在Python中用于函数操作
【6月更文挑战第20天】高阶函数如`map`, `filter`, `reduce`和`functools.partial`在Python中用于函数操作。装饰器如`@timer`接收或返回函数,用于扩展功能,如记录执行时间。`timer`装饰器通过包裹函数并计算执行间隙展示时间消耗,如`my_function(2)`执行耗时2秒。
16 3
|
2天前
|
存储 JavaScript
js的forEach和map的区别
js的forEach和map的区别
7 1
|
11天前
|
Python
在Python中,`map()`, `filter()` 和 `reduce()` 是函数式编程中的三个核心高阶函数。
【6月更文挑战第24天】Python的`map()`应用函数到序列元素,返回新序列;`filter()`筛选满足条件的元素,生成新序列;`reduce()`累计操作序列元素,返回单一结果。
18 3
|
25天前
|
Java API 容器
Java 8 的流库:Filter、Map、FlatMap 及 Optional 的概念与用法
【6月更文挑战第9天】Java 8 引入了许多强大的新特性,其中流库(Stream API)和 Optional 类极大地简化了集合操作和空值处理。本文将深入探讨 filter、map、flatMap 以及 Optional 的概念和用法,并提供示例代码来展示其实际应用。
22 4
|
7天前
|
存储 安全 程序员
老程序员分享:List、Map、Set之间的联系与区别:
老程序员分享:List、Map、Set之间的联系与区别:
|
9天前
map::operator[] 底层大致介绍及与 map::insert() 区别
map::operator[] 底层大致介绍及与 map::insert() 区别

热门文章

最新文章