Search code examples
spring-webfluxreactive-programming

How to stream 2 objects into a Flux mapped from the same input Flux?


I have a Flux<List<ProgressEvent>> where ProgressEvent has a String message and a double value. I would like to generate a Flux<ServerSentEvent<String>> where I generate 2 ServerSentEvent<String> items in the target stream for 1 List<ProgressEvent> in the source stream.

For now I did something like this:

Flux<List<ProgressEvent>> source = ...

Flux<ServerSentEvent<String>> target = source
    .map(events -> ServerSentEvent.<String>builder() ...)
    .mergeWith(source.map(events -> ServerSentEvent.<String>builder() ...))

But it feels a bit strange to read twice from the source stream. Is there a better way?


Solution

  • The easiest solution is flatMap + Flux.just:

        Flux<ServerSentEvent<String>> target = source.flatMap(events ->
                Flux.just(ServerSentEvent.<String>builder() ..., ServerSentEvent.<String>builder() ...)
        )