本文主要研究一下flux的map與flatMap的區別react
@Test public void testMap() throws InterruptedException { Flux.just(1, 2, 3, 4) .log() .map(i -> { try { TimeUnit.SECONDS.sleep(1); } catch (InterruptedException e) { e.printStackTrace(); } return i * 2; }) .subscribe(e -> LOGGER.info("get:{}",e)); }
這裏頭的map是純元素轉換
輸出異步
10:53:57.058 [main] INFO reactor.Flux.Array.1 - | onSubscribe([Synchronous Fuseable] FluxArray.ArraySubscription) 10:53:57.062 [main] INFO reactor.Flux.Array.1 - | request(unbounded) 10:53:57.063 [main] INFO reactor.Flux.Array.1 - | onNext(1) 10:53:58.067 [main] INFO com.example.demo.FluxTest - get:2 10:53:58.067 [main] INFO reactor.Flux.Array.1 - | onNext(2) 10:53:59.071 [main] INFO com.example.demo.FluxTest - get:4 10:53:59.071 [main] INFO reactor.Flux.Array.1 - | onNext(3) 10:54:00.076 [main] INFO com.example.demo.FluxTest - get:6 10:54:00.076 [main] INFO reactor.Flux.Array.1 - | onNext(4) 10:54:01.080 [main] INFO com.example.demo.FluxTest - get:8 10:54:01.081 [main] INFO reactor.Flux.Array.1 - | onComplete()
@Test public void testFaltMap() throws InterruptedException { Flux.just(1,2,3,4) .log() .flatMap(e -> { return Flux.just(e*2).delayElements(Duration.ofSeconds(1)); }) .subscribe(e -> LOGGER.info("get:{}",e)); TimeUnit.SECONDS.sleep(10); }
這裏的flatMap,將元素轉爲Mono或Flux,轉換操做裏頭還能夠進行異步操做
輸出code
10:54:01.088 [main] INFO reactor.Flux.Array.2 - | onSubscribe([Synchronous Fuseable] FluxArray.ArraySubscription) 10:54:01.089 [main] INFO reactor.Flux.Array.2 - | request(256) 10:54:01.089 [main] INFO reactor.Flux.Array.2 - | onNext(1) 10:54:01.137 [main] INFO reactor.Flux.Array.2 - | onNext(2) 10:54:01.137 [main] INFO reactor.Flux.Array.2 - | onNext(3) 10:54:01.138 [main] INFO reactor.Flux.Array.2 - | onNext(4) 10:54:01.138 [main] INFO reactor.Flux.Array.2 - | onComplete() 10:54:02.143 [parallel-1] INFO com.example.demo.FluxTest - get:2 10:54:02.143 [parallel-1] INFO com.example.demo.FluxTest - get:4 10:54:02.143 [parallel-1] INFO com.example.demo.FluxTest - get:6 10:54:02.143 [parallel-1] INFO com.example.demo.FluxTest - get:8
flatMap的轉換Function要求返回一個Publisher,這個Publisher表明一個做用於元素的異步的轉換操做;而map僅僅是同步的元素轉換操做。orm