当前位置: 首页 > 面试题库 >

RxSwift地图和flatMap的区别

姬经义
2023-03-14
问题内容

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

但是我看到flatMap直接用于基本类型的Observable。例如,下面的代码,它们都产生相同的输出。有人可以帮助我了解map和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映射到其他示例中。

这是来自Reactive扩展文档的报价,

FlatMap运算符通过将您指定的函数应用于源Observable发出的每个项目来转换Observable,该函数返回一个本身发出项目的Observable。然后,FlatMap合并这些生成的Observable的发射,将这些合并的结果作为自己的序列发射。

例如,当您有一个Observable发出一系列本身具有Observable成员的项目或可以以其他方式转换为Observable的项目时,此方法很有用,这样您就可以创建一个新的Observable来发出由Observable发出的项目的完整集合这些项目的子可观测项。

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

请注意,您曾经使用过,

student.onNext(ryan)

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

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元素本身都可以发出值,因为它们本身是流。



 类似资料:
  • 当我在Spark中使用数据帧时,有时我必须只编辑该数据帧中特定列的值。例如,如果我的数据帧中有一个字段,如果我想将添加到的每个值中,那么我可以编写一个自定义udf,使用数据帧的功能来完成工作,或者我可以在数据帧上做一个,然后从生成的RDD中提取另一个数据帧。 我想知道的是udf在引擎盖下是如何工作的。在这种情况下,请给我一个使用map/udf的比较。性能有什么不同? 谢谢

  • 问题内容: 在 Swift 4.1中 似乎已弃用。但是在 Swift 4.1中 有一个新方法正在做同样的事情?有了它,您可以变换集合中的每个对象,然后删除所有为零的项目。 像flatMap一样 像compactMap 在做同样的事情。 这两种方法有什么区别?苹果为何决定重命名该方法? 问题答案: Swift标准库为函数定义了3个重载: 可以通过两种方式滥用最后一个重载函数: 考虑以下struct和

  • onmaploadedcallback.onmaploaded() 我不是很清楚。

  • 问题内容: 似乎这两个功能非常相似。它们具有相同的签名(接受),并且它们的大理石图看起来完全相同。无法在此处粘贴图片,但这是用于concatMap的图片,这是用于flatMap的图片。在结果的描述中似乎存在一些细微的差异,其中所产生的包含通过合并产生的可观察变量产生的项目,而所产生的包含通过首先合并所产生的可观察变量并发出合并结果而产生的项目。 但是,这种微妙之处对我来说还不清楚。任何人都可以更好

  • 有人能给我解释一下map和flatMap之间的区别,以及什么是各自的好用例吗? “结果扁平化”是什么意思?它有什么好处?

  • 我对spark(和编程)很陌生,所以如果你能帮助我理解这两个输出之间的区别,那就太好了。