0

In my reactive Java 9 Spring Boot 2 with Spring HATEOAS application, I have a REST API returning Mono<Resources<Resource<T>>>. In the application layer, I'd like the data to be Mono<List<T>> but how can I concisely map Mono<Resources<Resource<T>>> to Mono<List<T>>?

I was expecting something like:

public Mono<List<Order>> orders() {
    return rest.orders()
        .flatmap(List::stream)
        .map(r -> r.getContent())
        .collect(Collectors.toList());
}

but this fails to compile because List does not define List.stream(Resources<Resource<Order>>. The rest.orders() returns Mono<Resources<Resource<Order>>>. Any ideas?

Jan Nielsen
  • 10,892
  • 14
  • 65
  • 119

1 Answers1

1

A (memory-sloshing) solution:

public Mono<List<Order>> orders() {
    return rest.orders()
        .map(r -> toList(r));
}

private List<Order> toList(Resources<Resource<Order>> resources) {
    List<Order> orders = new ArrayList<>();
    resources.forEach(r -> orders.add(r.getContent());
    return orders;
}
Jan Nielsen
  • 10,892
  • 14
  • 65
  • 119