RxSwift map 和 flatMap 的区别 [英] RxSwift map and flatMap difference

查看:119
本文介绍了RxSwift map 和 flatMap 的区别的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我无法理解 RxSwift 中 map 和 flatMap 之间的区别.在 RxSwift 游乐场示例和书籍中, flatMap 用作转换具有内部 Observable 属性的 Observable.

I can't understand the difference between map and flatMap In RxSwift. In the RxSwift playground examples and the books, flatMap is used as converting Observables which has inner Observable property.

但是我看到 flatMap 直接用于基本类型的 Observable.例如对于下面的代码,它们都产生相同的输出.有人可以帮我理解 map 和 flatMap 之间的区别

However I see flatMap being used directly on Observable of basic types. For example for below code, both of them produces the same output. Can someone help me to understand the difference between map and flatMap

struct Student {
    let score:Int
}

let ryan = Student(score:80)
let student = PublishSubject<Student>()

let deneme = student.map({ val in
    return Student(score: val.score+10)
})
deneme.subscribe(onNext: {
    print("StudentMAP: \($0.score)")
})

let deneme2 = student.flatMap({ val -> Observable<Student> in
    return Observable.of(Student(score: val.score + 10))
})

deneme2.subscribe(onNext: {
    print("StudentFlatMAP: \($0.score)")
})

 student.onNext(ryan)

推荐答案

flatMapmap 类似,但它将可观察的元素转换为可观察的序列.您使用的示例比较简单,它只是发送和 Observable 映射到其他东西.

flatMap is similar to map, but it transforms element of observable to an observable of sequences. The example you use is relatively simple, it is simply sending and Observable mapped into something else.

这里引用自 Reactive 扩展文档,

Here is quote from Reactive extension documentation,

FlatMap 运算符通过应用函数来转换 Observable您指定给源 Observable 发出的每个项目,其中该函数返回一个自身发出项目的 Observable.平面图然后合并这些结果 Observables 的发射,发射这些合并的结果作为它自己的序列.

The FlatMap operator transforms an Observable by applying a function that you specify to each item emitted by the source Observable, where that function returns an Observable that itself emits items. FlatMap then merges the emissions of these resulting Observables, emitting these merged results as its own sequence.

这个方法很有用,例如,当你有一个 Observable发出一系列本身具有 Observable 成员或以其他方式可转换为 Observables,以便您可以创建一个新的 Observable 发出由这些项目的子 Observables.

This method is useful, for example, when you have an Observable that emits a series of items that themselves have Observable members or are in other ways transformable into Observables, so that you can create a new Observable that emits the complete collection of items emitted by the sub-Observables of these items.

如果稍微扩展一下示例,您就会知道 flatMap 实际上将每个元素转换为一个序列.

If you extend the example a bit, you will know that flatMap actually transforms each element into a sequence.

注意你使用了,

student.onNext(ryan)

删除您的 dename2 并在下面添加此代码,

Remove your dename2 and add this code below,

let studentObservable: PublishSubject<Student> = PublishSubject()

let deneme2 = student.flatMap({ val -> Observable<Student> in
    return studentObservable.map { val in Student(score: val.score + 10) }
})

deneme2.subscribe(onNext: {
    print("StudentFlatMAP: \($0.score)")
})

student.onNext(ryan)

studentObservable.onNext(Student(score: 80))
studentObservable.onNext(Student(score: 90))
studentObservable.onNext(Student(score: 100))

现在,您可以看到 map 将简单地从序列转换一个值并创建新的 Observable,而 flatMap 将其转换为序列.现在,每个 flatMapped 元素本身都可以发出值,因为它们本身就是流.

Now, you can see that map would simply transform a value from sequence and new Observable is created, while flatMap transforms it into sequence. Now, each of the flatMapped elements can themselves emit values since they are stream themselves.

这篇关于RxSwift map 和 flatMap 的区别的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆