Flux 的方法非常多(几百个),但你不需要全部记住。我们可以把它们按照"功能"分成几类,就像厨房里不同的工具:
1. 制造水源(创建操作符)
用来定义流量的来源。
just(T... data):最直接的,把现成的数据塞进去。fromIterable(Iterable):把List或Set变成Flux。range(int start, int count):生成一个整数序列(如 1 到 100)。interval(Duration):定时器。每隔一段时间发一个数字(0, 1, 2...),常用于心跳检测。empty():直接发送完成信号,水管里啥也没有。error(Throwable):直接发送错误信号,水管一通就爆。
2. 加工转换(转化操作符)
最常用的部分,用来改变流里的数据。
-
map(Function):1对1转换 。把 A 变成 B(如:把"洗洁精"字符串变成Soap对象)。 -
flatMap(Function):1对N转换(异步) 。把一个元素变成一个新的Flux。比喻:
map是把菜切碎;flatMap是把一个订单拆成多个物流单,并异步去查每一个物流。 -
buffer(int n):打包 。把零散的水滴收集满n个,凑成一个List再往下流。 -
collectList():把水管里所有的水都接住,最后装进一个Mono<List<T>>。
3. 过滤与挑选(过滤操作符)
决定哪些东西能流过去。
filter(Predicate):符合条件的才让过。distinct():去重。流过的东西如果重复,只放行第一个。take(long n):只取前 n 个。拿完就关水龙头。skip(long n):跳过前 n 个,从后面开始接。
4. 组合流(组合操作符)
把多根水管拼在一起。
-
mergeWith(Publisher):合并。两根管子汇成一根,谁有水谁先流(交错输出)。 -
zipWith(Publisher):配对。左边流出一滴,右边流出一滴,凑成一对(Tuple)再往下走。比喻:
merge是合流,zip是相亲,必须两边都有人才成对。 -
concatWith(Publisher):首尾相接。等第一根管子流完了,才开始流第二根。
5. 副作用与生命周期(监听操作符)
只观察,不干预。
doOnNext(Consumer):数据流过时看一眼(打日志)。doOnError(Consumer):出故障时看一眼。doOnComplete(Runnable):流完时看一眼。doFinally(Consumer):管它成功还是失败,最后都要执行(类似finally块)。
6. 错误处理(容错操作符)
水管爆了之后的救场方案。
onErrorReturn(T):出错了?别报警,直接返回一个默认值。onErrorResume(Function):出错了?切到备用水管(另一个Flux)。retry(long n):出错了?再试n次。
总结
- 如果你要改变 数据:找
map/flatMap。 - 如果你要减少 数据:找
filter/take。 - 如果你要合并 数据:找
zip/merge。 - 如果你要观察 数据:找
doOn...系列。