发布网友
共1个回答
热心网友
Kotlin Flow操作符大全,全面解析各类操作符的基本用法。首先,Flow分为冷流和热流。冷流在无消费者时不会生产数据,而热流在无观察者时也会生产数据。基于此,Flow大致可以分为以下几类:
1. **一般 Flow**:仅有一个观察者,用于基本数据传输。
2. **StateFlow**:具有状态的Flow,可以有多个观察者,热流特性,构造时需要传入初始值。通常用于UI相关的数据观察,类似于LiveData。
3. **SharedFlow**:具有热流特性,无需初始值,可以有多个观察者。使用时,通常构造一个FlowEventBus。
接下来,重点介绍操作符分类:
- **中间操作符**:主要用于执行操作,返回仍是Flow。
- **末端操作符**:触发流的执行,返回值通常不是Flow。
### 创建Flow
- **基本方法**:使用`emit`发射单个值,`emitAll`发射一个流,类似`list.addAll(anotherList)`。
- **快速创建flow**:类比`listOf()`,将其他数据转换为普通的flow,尤其是集合向Flow的转换。
- **回调方法改造成flow**:类似`suspendCoroutine`。
- **空流**:返回一个空流。
### 末端操作符
- **`collect`**:触发flow运行,通常是监听方式。
- **`collectIndexed`**:与`collect`区别在于新值发出时,若上个收集未完成,则取消上个值的收集操作。
- **`takeLast`**:仅保留最新数据。
- **`toList`, `toSet`**:将结果添加到集合或转换为集合。
- **`emit`**:直接触发流执行,入参为`coroutineScope`,一般不会直接调用,常与其它操作符结合使用。
- **`last`**, **`lastOrNull`**:返回流最后一个值,后者可为空。
- **`first`**, **`firstOrNull`**:返回流第一个值,后者可为空。
- **`receiveFirst`**, **`receiveFirstOrNull`**:接收流的第一个值,前者报错,后者发出多值时除第一个外均置为null。
### 回调操作符
- **`onStart`**, **`onCompletion`**, **`onEach`**:分别在流开始、结束或发出元素前调用。
### 变换操作符
- **`map`, `mapLatest`**:将值进行变换。
- **`transform`**:对值进行变换、跳过或多次发送,非常灵活。
- **`filter`**, **`filterNot`**, **`filterNotNull`**:筛选值。
- **`drop`, `dropWhile`**:丢弃值。
- **`take`, `takeWhile`**:获取前n个值或直到不满足条件。
- **`debounce`, `sample`**:实现防抖和采样功能。
- **`distinctUntilChanged`, `distinctUntilChangedBy`**:去重操作。
- **`buffer`**, **`bufferConflated`**:保留最新值。
- **`runOnUiThread`**:指定执行线程。
### 组合操作符
- **`combine`, `combineTransform`**:组合每个流的最新值。
- **`merge`**:合并多个流为一个流。
- **`flattenConcat`, `flattenMerge`**:以顺序或指定并发数方式合并流。
- **`flatMapLatest`, `flatMapMerge`**:将流转换为另一个流,再合并。
### 功能性操作符
- **`checkCompletion`**, **`catch`**:检查完成或捕获异常。
- **`retry`, `retryWhen`**:重试机制。
- **`buffer`, `bufferConflated`**:在执行期间创建单独协程。
### 总结
在实际开发中,根据具体场景选择合适的操作符,如搜索场景使用`debounce`防抖,网络请求使用`retry`,组件通信使用`SharedFlow`,数据合并使用`combine`等操作符,从而提升开发效率。