Search code examples
javarx-javareactive-programming

Reactive Java List to Map


I have a methodA which takes an argument and returns a result. I am writing a reactive method to invoke the function in bulk. But Not able to get my head around reactive syntax. My code looks like this

List<GetResult> successfulResults = 
Collections.synchronizedList(new ArrayList<>());
Map<String, Throwable> erroredResults = new ConcurrentHashMap<>();
Flux.fromIterable(docsToFetch).flatMap(key -> reactiveCollection.getAndTouch(key, Duration.ofMinutes(extendExpiryInMin))
    .onErrorResume(e -> {
        erroredResults.put(key, e);
        return Mono.empty();
    })
).doOnNext(successfulResults::add).last().block();

The current implementation calls the method but collects the result in list. Collecting result in list does not make sense to my use case. I want to collect the result in a hashmap of key and result.


Solution

  • The solution is

    List<String> docsToFetch = Arrays.asList("airline_112", "airline_1191", "airline_1203");
    
    Map<String, GetResult> successfulResults = new ConcurrentHashMap<>();
    Map<String, Throwable> erroredResults = new ConcurrentHashMap<>();
    
    Flux.fromIterable(docsToFetch).flatMap(key -> reactiveCollection.get(key).onErrorResume(e -> {
        erroredResults.put(key, e);
        return Mono.empty();
    }).doOnNext(getResult -> successfulResults.put(key, getResult))).last().block();