private Mono<List<Integer>> filterAndMap(Mono<List<Integer>> listMono) {
return listMono.filter(integers -> integers.size() == 3)
.map(integers -> integers.stream()
.map(integer -> integer * 10)
.collect(Collectors.toList()));
}
void method1() {
Flux.just(Arrays.asList(1, 2, 3), Arrays.asList(4, 5, 6), Arrays.asList(7, 8, 9, 10))
.flatMap(integers -> this.filterAndMap(Mono.just(integers)))
.doOnNext(System.out::println)
.blockLast();
}
void method2() {
Flux.just(Arrays.asList(1, 2, 3), Arrays.asList(4, 5, 6), Arrays.asList(7, 8, 9, 10))
.convertFluxToMono()?
.transform(this::filterAndMap)
.doOnNext(System.out::println)
.block();
}
更新:
一点我想要实现的内容。我有两个服务--一个通过Http返回memono
,另一个通过Redis返回
>
flus
。对于这两种情况,我有完全相同的功能-10-15个操作符链,我想要实现的是避免重复代码。
例如:
void f1() {
Mono<List<Integer>> mono = getFromHttp();
mono
.map(integers -> integers.stream().collect(Collectors.groupingBy(Function.identity())))
.filter(entry -> entry.size() > 5)
//...
//many other operators
//...
//.flatMap()
//.switchIfEmpty()
//.doOnNext()
.retryWhen();
}
void f2() {
Flux<List<Integer>> flux = getFromRedis();
flux.
//...
//same functionality here
//...
}
private Flux<List<Integer>> filterAndMap(Flux<List<Integer>> listMono) {
return listMono.filter(integers -> integers.size() == 3)
.map(integers -> integers.stream()
.map(integer -> integer * 10)
.collect(Collectors.toList()));
}
根据注释,这里的问题是“如何在不重复代码的情况下对mono
和flux
应用相同的转换?”
您可以使用一个简单的实用函数,如下所示:
static <T> Function<Mono<T>, Mono<T>> toMonoTransformer(
Function<Flux<T>, Flux<T>> transformer) {
return listMono -> transformer.apply(listMono.flux()).next();
}
此功能可用于任何类型的任何变压器。然后,可以对流量按原样使用转换函数:
void method2() {
Flux.just(Arrays.asList(1, 2, 3), Arrays.asList(4, 5, 6), Arrays.asList(7, 8, 9, 10))
.transform(this::filterAndMap)
.doOnNext(System.out::println)
.blockLast();
}
void method1() {
Mono.just(Arrays.asList(1, 2, 3))
.transform(toMonoTransformer(this::filterAndMap))
.doOnNext(System.out::println)
.block();
}
我有一个返回列表的现有服务 我如何将下面的示例转换为通量,这样我的结果就可以流式传输,而不必在内存中聚集所有项目? 第一个问题:这里我首先将第一个查询的所有结果提取到内存中,然后在内存中迭代并形成我所有的,然后返回整个列表。 因此我试图返回
我有一个Web服务,我想检索树的元素到根节点。我有一个网络流量接口,它在每次调用时返回一个单声道: 让我们假设有一棵树 我想创建以下方法: 这将给我在getNodeChain(5)上一个通量,节点为5,3和1,然后完成。 不幸的是,我不太明白如何按顺序组合Monos,但不阻止它们。使用,我想我需要在每个mono上阻塞,以检查它是否有下一个元素。我发现的其他方法似乎只结合了固定数量的mono,但不是
我正在学习Spring WebFlux。 我的实体是这样的: 我有一个储存库(R2使用H2数据库)如下: 我的控制器是: 目前为止一切正常。我能够每3秒钟向视图返回整个用户列表。这里没有任何问题。 现在,我想将Flue,即Flux Flux2=userRepository.findAll()发送到视图。这意味着,不是如何才能? 问题:我如何才能做到这一点?即我如何才能每3秒将整个Flux发送到我的
如何将flux 转换为mono 对象?
我在我的项目中使用spring webflux与外部API进行通信。在我的项目中,我无法将Flux转换为List。 在尝试对collectList().block()执行同样的操作时,flux的所有元素都被连接到一个字符串中,并存储在List的第0个索引处。如果我返回Flux而不是List,那么它会发送预期的响应。但我需要操作内容并将其作为子对象添加到其他对象中&因此尝试返回列表。 预期结果:[“
我想使用反应性编程将我的excel文件存储到我的数据库中。在非反应式中,这很容易做到,但我不能在反应式中做类似的事情,我应该写什么来存储它到我的mongo数据库中?