Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Java Flux GroupedFlux count() print

Hi rectors all aver the world. I'm doing reactivi programming in Java. I'm a java/grails/react developer but first steps with reactive programming with Spring Boot, version 2 M7 in this case. In the next code:

@GetMapping(API_BASE_PATH + "/flux4")
public String flux4() {
    StringBuilder sb = new StringBuilder();
    Flux.just("alpha", "bravo", "charlie")
        .map(String::toUpperCase)
        .flatMap(s -> Flux.fromArray(s.split("")))
        .groupBy(String::toString)
        .sort(Comparator.comparing(GroupedFlux::key))
        .map(group -> group.key() + " => " + group.count() + "; ")
        .subscribe(sb::append);

    return "flux 4: " + sb.toString();
}

I get the group.key() printed but how caon I get printed the group.count() ?

Any help is welcome

Cheers

Juan

like image 688
Juan Salvador Avatar asked Dec 21 '17 11:12

Juan Salvador


1 Answers

I think I am reading the same book as you :)

Here is the solution using block().

        Flux.just("alpha", "beta", "charlie")
        .map(String::toUpperCase)
        .flatMap(s -> Flux.fromArray(s.split("")))
        .groupBy(String::toString)
        .sort((o1,o2) -> o1.key().compareTo(o2.key()))
        .flatMap(group -> Mono.just(Tuples.of(group.key(), group.count().block()))) 
        .map(keyAndCount -> keyAndCount.getT1() + " => " + keyAndCount.getT2() + "; ")

I am wondering if there is an alternate way that doesn't call block()?. Now group.count() returns a Mono<Long>, and group.key() returns a String. It would be good if we could combine the two to form a Mono<Tuple2<String, Long>> without having to evaluate the result of the Mono. Seems like there should be a general method for doing that?

The book tried to use:

Mono.just(group.key()).and(group.count())

But that just listens for the completion events and returns a Mono<Void>, and therefore gives me compile errors...

Addendum: found it! Use the zip method:

    Flux.just("alpha", "beta", "charlie")
    .map(String::toUpperCase)
    .flatMap(s -> Flux.fromArray(s.split("")))
    .groupBy(String::toString)
    .sort((o1,o2) -> o1.key().compareTo(o2.key()))
    .flatMap(group -> Mono.zip(Mono.just(group.key()), group.count()))
    .map(keyAndCount -> keyAndCount.getT1() + " => " + keyAndCount.getT2() + "; ")
like image 55
Darren Avatar answered Oct 08 '22 00:10

Darren