【发布时间】:2019-03-26 09:33:27
【问题描述】:
我的理解是Mono<List<T>> 是同步的Flux<T>
并且 Flux 不能是一个 rest api 响应。
我说的对吗?
如果不是,Mono<List<T>> 和 Flux<T> 有什么区别
或者 Flux 可能是某个地方的休息 api 响应?
【问题讨论】:
我的理解是Mono<List<T>> 是同步的Flux<T>
并且 Flux 不能是一个 rest api 响应。
我说的对吗?
如果不是,Mono<List<T>> 和 Flux<T> 有什么区别
或者 Flux 可能是某个地方的休息 api 响应?
【问题讨论】:
Mono<List<T>> 意味着您将一次异步获得T 元素的完整列表。Flux<T> 意味着您将获得零到多个 T 元素,可能会一个一个地出现。如果您从 HTTP 客户端获取此类返回类型,例如 WebClient,Mono<List<T>> 和 Flux<T> 从运行时的角度来看可能或多或少是等效的,如果返回的 Content-Type 是例如 @987654329 @。在这种情况下,解码器将一次性反序列化响应。唯一不同的是,Flux<T> 提供了更多有趣的运算符,您可以随时使用collectList 并回退到Mono<List>。
另一方面,如果返回的Content-Type 是流式传输的,例如"application/stream+json",那么这肯定会产生影响,因为您将逐个获取元素。事实上,如果返回的流是无限的,选择Flux<T> 非常重要,因为另一个永远不会完成。
【讨论】:
Mono<List<T>> 将发出零个或最多一个 T 类型的项目列表。 Flux<T>将发出零个或多个 T 类型的项目
Momo 换行是有界的,Flux 不是。
Mono<List<T>>是一个同步的 Flux
Mono 和 Flux 都是在 Reactive Stream Specification 中指定的 Publisher 接口的 Reactor 实现。
Reactor Mono 类:
public abstract class Mono<T> implements Publisher<T> {...}
Reactor Mono 类:
public abstract class Flux<T> implements Publisher<T> {...}
Flux 不能是一个 rest api 响应。 当然
Flux可以作为REST API的响应类型。通过使用 Flux 作为返回类型,您可以轻松地从异步处理切换到同步处理。如果您使用 Spring Boot,您甚至可以通过将 API 端点的Content-Type更改为 @Brian 提到的application/stream+json将数据流式传输给您的消费者。
请注意,Flux 和 Mono 是非阻塞的,这意味着您可以更有效地使用工作线程(计算机资源)。
【讨论】:
Mono<List<T>>转换为Flux<T>?
mono.map(list -> list.toArray(new T[0])) .flux() .flatMap(Flux::just);