Java 如何在Flux中使用zipWith迭代元组?

Java 如何在Flux中使用zipWith迭代元组?,java,spring,spring-webflux,reactor,Java,Spring,Spring Webflux,Reactor,我想迭代一个提供引用id的基本列表。然后在下一步中,我想进行多个服务调用,并将结果聚合到一个元组中 然后,作为最后一步,我想迭代所有引用id,并通过事件流直接返回每个生成的JSONObject @GetMapping(value = "/test", produces = TEXT_EVENT_STREAM_VALUE) public Flux<JSONObject> test(Integer pages) { pages = 1; return Flux.range

我想迭代一个提供
引用id
的基本列表。然后在下一步中,我想进行多个服务调用,并将结果聚合到一个元组中

然后,作为最后一步,我想迭代所有
引用id
,并通过事件流直接返回每个生成的
JSONObject

@GetMapping(value = "/test", produces = TEXT_EVENT_STREAM_VALUE)
public Flux<JSONObject> test(Integer pages) {
    pages = 1;
    return Flux.range(1, pages)
            .map(pageNumber -> Arrays.asList(1 * pageNumber, 2 * pageNumber, 3 * pageNumber)) //referenceIds for testing
            .flatMap(numbers -> Flux.fromIterable(numbers).zipWith(Mono.zip(a(numbers), b(numbers)))) //results based on reference ids
            .map(tuple -> {
                Integer number = tuple.getT1();
                Tuple2<List<String>, List<String>> lookup = tuple.getT2();

                JSONObject json = new JSONObject();
                json.put("number", number);
                json.put("someMore", <fromLookup>);
                return json;
            });
}
@GetMapping(value=“/test”,products=TEXT\u EVENT\u STREAM\u value)
公共流量测试(整型页面){
页数=1;
返回流量范围(1页)
.map(pageNumber->Arrays.asList(1*pageNumber,2*pageNumber,3*pageNumber))//用于测试的引用ID
.flatMap(numbers->Flux.fromIterable(numbers).zipWith(Mono.zip(a(numbers),b(numbers))//基于引用ID的结果
.map(元组->{
整数=tuple.getT1();
Tuple2 lookup=tuple.getT2();
JSONObject json=新的JSONObject();
put(“number”,number);
json.put(“someMore”,);
返回json;
});
}
对于本例,方法
a()
b()
的返回类型无关紧要。重要的部分是:

如果我只是返回Flux.fromIterable(数字)一切都很好。 但是当使用
.zipWith()
进行聚合时,我只收到数字列表的第一个元素。其他的都丢了。为什么?

旁注:我需要使用
.zipWith()
并行执行这些方法调用(一些运行时间更长的事务)

其他的都丢了。为什么?

来自Flux类文档:

将此{@link Flux}与另一个{@link Publisher}源压缩,即 也就是说,等待两者都发出一个元素,然后将它们组合起来 元素一次进入{@link Tuple2}。接线员将继续 直到任何源完成为止

您可以执行a()和b()调用,压缩结果,然后将
numbers
列表展开为flux并按如下方式添加结果:

   .flatMap(numbers -> Mono.zip(a(numbers), b(numbers))
                .flatMapMany(tuple -> Flux.fromIterable(numbers).map(i -> Tuples.of(i,tuple))))

所以我的方法可能是错误的?通过拥有一个
列表编号
,我想生成一个
元组
,任何东西都是进一步的Flux/Mono调用的结果。也许你可以举个例子?再问一个问题:如果我在上面加上这个,元组聚合通常是有效的。但是当处理完所有数据后,应该由端点发出的返回的
服务器发送的事件开始发出。我希望它在创建每个
JSONObject
后立即发出。但事实并非如此?如何将final
map()
方法更改为不等待所有数据聚合?这是我所期望的,但事实并非如此。服务器发送的事件启动wehn所有数据都已由最后一个映射方法处理。我希望看到立即发生的事件。我将接受你的回答,并开始一个新的问题,因为这个问题的主题是如何结合通量和压缩是正确的。