Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring boot 在Spring反应式编程中,如何从两个通量(对象)中获取通量或列表?_Spring Boot_Spring Webflux_Project Reactor_Reactor - Fatal编程技术网

Spring boot 在Spring反应式编程中,如何从两个通量(对象)中获取通量或列表?

Spring boot 在Spring反应式编程中,如何从两个通量(对象)中获取通量或列表?,spring-boot,spring-webflux,project-reactor,reactor,Spring Boot,Spring Webflux,Project Reactor,Reactor,我对Spring项目是新手。在我的Spring Boot Controller类中,我有 Flux(数据库中所有房屋的列表)和Flux 来自服务层,其中给定的Flux是给定房屋的图像,就像房屋列表一样,每个房屋都有自己的图像集合。这意味着我必须迭代Flux以获取房屋id,然后在图像上调用findByHouseId以获取Flux,每个图像都有houseId属性。每个图像对象都有一个属性“cover”,其字符串值为“yes”或“no”,另一个属性“type”具有各种字符串值,如“卧房”。我想收一张支

我对Spring项目是新手。在我的Spring Boot Controller类中,我有

Flux(数据库中所有房屋的列表)和Flux

来自服务层,其中给定的
Flux
是给定房屋的图像,就像房屋列表一样,每个房屋都有自己的图像集合。这意味着我必须迭代
Flux
以获取房屋id,然后在图像上调用findByHouseId以获取
Flux
,每个图像都有houseId属性。每个图像对象都有一个属性“cover”,其字符串值为“yes”或“no”,另一个属性“type”具有各种字符串值,如“卧房”。我想收一张支票

list of Flux<Image> like List<Flux<Image>> or List<List<Image>>
因此,现在在thyemleaf视图模板中,我可以:

<div data-th-each="house : ${houses}">
        <h3 data-th-text="${house.title}"></h3>
        <div data-th-each="image : ${mapOfImages.get(house.houseId)}">
          <h5 data-th-text="${image.fileName}"></h5>
          <h5 data-th-text="${image.type}"></h5>
        </div>
 </div>   


所使用的数据库是Mongodb,它有两个独立的集合:house和image,也就是说,没有嵌入式集合,将图像绑定到房屋的唯一东西是图像上的houseId属性。

您基本上希望将
房屋
对象流转换为
图像
对象流

因此,使用
flatMap()
Flux
(或
Flux
)转换为
Flux

另外,我建议你读一读


编辑:


因此,您需要一个
monplease共享实际的类和一个演示您所尝试的代码片段。我认为本文应该对您有所帮助,也请参阅本文并感谢Murat。正在到达那里,但仍然没有到达那里。为了澄清,我在问题末尾添加了更多文本。好的,请参阅最后一次编辑。我认为
collectMultiMap()
可以做你想做的事。希望这能解决你的问题。看起来不错。我将用它来实现。大多数图像具有houseId属性,但少数图像(如街景或城市视图类型图像)的houseId属性为空,但当该房屋显示在视图中时,仍将为该房屋收集此类图像以显示关联的街景或城市图像。谢谢你会在我完成后很快更新。当然,希望对你有所帮助
List<House> houses  --> List of all houses
Map<String,List<Image>> mapOfImages  --> where key is houseId 
model.addAttribute("houses",houses);
model.addAttribute("mapOfImages",mapOfImages);
<div data-th-each="house : ${houses}">
        <h3 data-th-text="${house.title}"></h3>
        <div data-th-each="image : ${mapOfImages.get(house.houseId)}">
          <h5 data-th-text="${image.fileName}"></h5>
          <h5 data-th-text="${image.type}"></h5>
        </div>
 </div>   
Mono<List<Image>> images = houseService.findAllHouses() // returns Flux<House>
  .flatMap(house -> imageService.findByHouseId(id)      // returns Flux<Image>
                        .filter(image -> "yes".equals(image.getCover()) && ... )) 
  .collectList();                                       //returns Mono<List<Image>>
return images.map(imageList -> ServerResponse.ok()
                                       .body(fromObject(imageList)));
Mono<Map<String, Collection<Image>>> images = houseService.findAllHouses()
     .flatMap(house -> imageService.findByHouseId(id)
                           .filter(...)
                           .map(image -> Tuples.of(id, image)))
     .collectMultiMap(tuple -> tuple.getT1(), 
                      tuple -> tuple.getT2());
...
    .collectMultiMap(image -> image.getHouseId(), image -> image);