Flow之map操作符

简介: Flow之map操作符

我们接着上文回忆一下:

flow方法构建的是一个扩展函数

collect作用是创建这个对象调用这个扩展函数。当调用emit方法时执行collect传进来的方法。

操作符

map:flow构建了一个FlowCollector的扩展函数并返回了一个SafeCollector对象。

map方法中会将这个flow进行包装:

public inline fun <T, R> Flow<T>.map(crossinline transform: suspend (value: T) -> R): Flow<R> = transform {
    //一,对传入的value
    value ->
   return@transform emit(transform(value))
}

最终调用transform方法,传入方法实现为调用emittransform后的值。

public inline fun <T, R> Flow<T>.transform(
    @BuilderInference crossinline transform: suspend FlowCollector<R>.(value: T) -> Unit
): Flow<R> = flow { // Note: safe flow is used here, because collector is exposed to transform on each operation
    //二,Flow<T>中的flow代码块将被执行,当调用到emit时会走到collect代码块中
    collect { value ->
        // kludge, without it Unit will be returned and TCE won't kick in, KT-28938
        return@collect transform(value)
    }
}

此时这个Flow为flow创建的那个SfaceFllow对象。

transform函数会再次构建一个flow再次创建一个SafeFlow对象并保存flow中的方法参数中。

当经过map之后构建的flow调用collect方法时,流程如下:

1.首先会执行transform后的flow代码块,可以看到执行到了collect方法调用者为Flow,也就是上一次调用map的flow对象中的代码块会执行

2.当调用map的flow代码块中调用emit方法会走到transform的collect中,可以看到将value传入到了transform中,此时的调用者为最外层的flow,也因此在调用再看下transform函数,该函数即为map的转换逻辑,接着会自动emit这个转换后的值也就到了第三部

3.调用emit最外层的collect将会被接收到也就是调用map的collect函数将会收到回调,此时收到的值是map转换后的值

TIPS:

流收集时会调用上一个流获取:flow中调用其他flow的collect触发收集,其他flow中提供原始数据,内层收集器进行原始数据封装再提供到最外层收集器中。

收集行为:flow代码块

收集器行为:collect代码块

最后放出这张图片:

总结

以上为个人理解,如有不对辛苦指正。

第一次看到flow感觉好别扭估计是函数式编程还是没有掌握思想,眼过千遍不如手过一遍,下一篇文章中我们自定义一个Flow收集器,并支持最简单的map操作符~


目录
相关文章
RxSwift操作符操作符map、flatMap、flatMapLatest、filter的使用与区别
RxSwift操作符操作符map、flatMap、flatMapLatest、filter的使用与区别
343 1
Rxjava源码解析笔记 | 剖析map、flatmap操作符的使用与联系
Rxjava源码解析笔记 | 剖析map、flatmap操作符的使用与联系
【Groovy】map 集合 ( map 集合操作符重载 | 使用 << 操作符添加一个元素 | 代码示例 )
【Groovy】map 集合 ( map 集合操作符重载 | 使用 << 操作符添加一个元素 | 代码示例 )
217 0
【Groovy】map 集合 ( map 集合操作符重载 | 使用 << 操作符添加一个元素 | 代码示例 )
【Groovy】map 集合 ( map 集合操作符重载 | *. 展开操作符 | 代码示例 )
【Groovy】map 集合 ( map 集合操作符重载 | *. 展开操作符 | 代码示例 )
124 0
【Groovy】map 集合 ( map 集合操作符重载 | *. 展开操作符 | 代码示例 )
|
4月前
|
Dart
Dart之集合详解(List、Set、Map)
Dart之集合详解(List、Set、Map)
|
1月前
|
Go 定位技术 索引
Go 语言Map(集合) | 19
Go 语言Map(集合) | 19
|
1月前
|
存储 前端开发 API
ES6的Set和Map你都知道吗?一文了解集合和字典在前端中的应用
该文章详细介绍了ES6中Set和Map数据结构的特性和使用方法,并探讨了它们在前端开发中的具体应用,包括如何利用这些数据结构来解决常见的编程问题。
ES6的Set和Map你都知道吗?一文了解集合和字典在前端中的应用
|
18天前
|
存储 分布式计算 Java
Stream很好,Map很酷,但答应我别用toMap():Java开发中的高效集合操作
在Java的世界里,Stream API和Map集合无疑是两大强大的工具,它们极大地简化了数据处理和集合操作的复杂度。然而,在享受这些便利的同时,我们也应当警惕一些潜在的陷阱,尤其是当Stream与Map结合使用时。本文将深入探讨Stream与Map的优雅用法,并特别指出在使用toMap()方法时需要注意的问题,旨在帮助大家在工作中更高效、更安全地使用这些技术。
28 0
|
2月前
|
存储 安全 Java
java集合框架复习----(4)Map、List、set
这篇文章是Java集合框架的复习总结,重点介绍了Map集合的特点和HashMap的使用,以及Collections工具类的使用示例,同时回顾了List、Set和Map集合的概念和特点,以及Collection工具类的作用。
java集合框架复习----(4)Map、List、set
|
2月前
|
Java
【Java集合类面试二十二】、Map和Set有什么区别?
该CSDN博客文章讨论了Map和Set的区别,但提供的内容摘要并未直接解释这两种集合类型的差异。通常,Map是一种键值对集合,提供通过键快速检索值的能力,而Set是一个不允许重复元素的集合。