Spring HATEOAS反应式应用:Mono<Resources<Resource<T>>>转Mono<List<T>>
解决Mono<Resources<Resource>>转Mono<List>的简洁实现
你的问题核心是没搞清楚Mono<Resources<Resource<Order>>>里的元素类型——你拿到的是一个Resources对象,不是List,所以直接用List::stream肯定会编译报错。咱们来一步步修正:
首先,rest.orders()返回的Mono<Resources<Resource<Order>>>,里面的Resources是Spring HATEOAS用来包装资源集合的类,它的getContent()方法会返回一个Iterable<Resource<Order>>,也就是所有的资源对象集合。
接下来我们需要做的是:
- 从Mono中取出
Resources对象 - 把
Iterable<Resource<Order>>转换成Stream - 提取每个
Resource里的实际Order对象 - 把这些Order收集成List,再包装回Mono
下面是可行的简洁实现代码:
import java.util.List; import java.util.stream.Collectors; import java.util.stream.StreamSupport; public Mono<List<Order>> orders() { return rest.orders() .map(resources -> StreamSupport.stream(resources.getContent().spliterator(), false) .map(Resource::getContent) .collect(Collectors.toList()) ); }
代码解释:
map(resources -> ...):处理Mono中的单个Resources对象,把它转换成List<Order>StreamSupport.stream(...):因为getContent()返回的是Iterable,没有直接的stream()方法,所以用StreamSupport把它转换成Stream.map(Resource::getContent):从每个Resource<Order>中提取出实际的Order对象.collect(Collectors.toList()):把所有Order收集成List
这样整个流程就完成了类型转换,而且完全符合反应式编程的链式风格,代码也很简洁。
内容的提问来源于stack exchange,提问作者Jan Nielsen
相关产品推荐
相关产品推荐

