webflux-flatMap与concatMap区别
- flatMap: 异步无序
- concatMap: 有序
flatMap
@Test
public void flatMapTest() throws InterruptedException {
Flux.range(1, 4)
.log()
.flatMap(e -> {
return Flux.just(e * 2).delayElements(Duration.ofSeconds(1));
}).subscribe(System.out::println);
TimeUnit.SECONDS.sleep(10);
}
结果:
22:25:25.190 [main] INFO reactor.Flux.Range.1 - | onSubscribe([Synchronous Fuseable]...
22:25:25.192 [main] INFO reactor.Flux.Range.1 - | request(256)
22:25:25.193 [main] INFO reactor.Flux.Range.1 - | onNext(1)
22:25:25.225 [main] INFO reactor.Flux.Range.1 - | onNext(2)
22:25:25.226 [main] INFO reactor.Flux.Range.1 - | onNext(3)
22:25:25.227 [main] INFO reactor.Flux.Range.1 - | onNext(4)
22:25:25.227 [main] INFO reactor.Flux.Range.1 - | onComplete()
6
2
4
8
concatMap
@Test
public void concatMapTest() throws InterruptedException {
Flux.range(1, 4)
.log()
.concatMap(e -> {
return Flux.just(e * 2).delayElements(Duration.ofSeconds(1));
}).subscribe(System.out::println);
TimeUnit.SECONDS.sleep(10);
}
结果:
22:20:52.498 [main] INFO reactor.Flux.Range.1 - | onSubscribe([Synchronous Fuseable]...
22:20:52.501 [main] INFO reactor.Flux.Range.1 - | request(32)
22:20:52.501 [main] INFO reactor.Flux.Range.1 - | onNext(1)
22:20:52.544 [main] INFO reactor.Flux.Range.1 - | onNext(2)
22:20:52.545 [main] INFO reactor.Flux.Range.1 - | onNext(3)
22:20:52.545 [main] INFO reactor.Flux.Range.1 - | onNext(4)
22:20:52.545 [main] INFO reactor.Flux.Range.1 - | onComplete()
2
4
6
8
结论
很清楚, concatMap会有序输出