当前位置: 首页 > 知识库问答 >
问题:

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

井宪
2023-03-14

我是Spring Reactive Project的新手。在我的Spring Boot Controller课程中

流量

来自给定的流量的服务层

list of Flux<Image> like List<Flux<Image>> or List<List<Image>>

仅包含“封面”=“是”或“类型”=“卧室”的图像。如何做到这一点?编程代码将回答这个问题。

尝试将以下内容作为解决方案的一部分,但即使是此部分解决方案也不起作用:

List<Flux<Image>> imagesList= new ArrayList<Flux<Image>>();
        Flux<House> houses = houseService.findAllHouses();

        houses.map(house ->  house.getId()).subscribe(id -> imageService.findByHouseId(id))
        .map(imageFlux ->imagesList.add(imageFlux));

请注意,我正在寻找的解决方案不涉及调用block()(否定被动的好处),除非这是唯一的方法。

在非反应性情况下,这就是我想要的:

List<House> houses  --> List of all houses
Map<String,List<Image>> mapOfImages  --> where key is houseId 

所以对于每个房子,我可以在视图模板中迭代房屋时轻松获得该房子的图像。

这些(房屋和地图图像)将传递给模型,如

model.addAttribute("houses",houses);
model.addAttribute("mapOfImages",mapOfImages);

因此,现在在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,也就是说,没有嵌入式集合,将图像绑定到房屋的唯一东西是image上的houseId属性。


共有1个答案

汪典
2023-03-14

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

因此,使用flatMap()转换通量

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>>

这里可以使用CollectList(),因为您最有可能想要将图像转换为单个Mono

return images.map(imageList -> ServerResponse.ok()
                                       .body(fromObject(imageList)));

此外,我建议阅读关于何时使用哪个运算符的项目反应器参考。

编辑:

所以,你想要一个单声道

我将描述艰难的方式,其中图像不包含房屋id。我们需要某物,它链接属于特定房屋的图像列表。您可以为此定义一个类,也可以只使用reactor。util。作用元组2。这样,我们就可以使用collectMap()

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);

 类似资料:
  • 我在NoSQL文档db Photo和Property中有两个独立的集合,其中Photo有propertyId参数,这意味着我可以找到属于给定属性(如房子)的所有照片。通常情况下,如果没有反应,我只会: 就两行。如何在反应式编程中做到以上几点 不使用block()?`承担一项义务。findByPropertyId返回列表,在被动情况下返回通量。

  • 我正在使用project reactor,我有下一个问题: 我有一个返回的方法,它包含一个CustomerDto列表,每个客户机都有属性,其中一个属性是付款列表。但是这个付款清单是空的。 我有下一个例外: 我想知道是否有一种非阻塞或最佳的方法来做这件事

  • 我现在正在使用Flux。我想创建一个通量 描述问题:我有一个工作案例,我有一个房屋清单和我所在的清单。我需要返回所有房屋的结果,我只会更改结果对象上的真/假标志。当然,第二个列表的元素可能更少。 有人能提出这样或其他的建议吗? }

  • 我正在使用SpringReactor3组件和SpringIntegration进行实验,以从JMS队列创建反应流(Flux)。 我试图从JMS队列(使用SpringIntegration的ActiveMQ)创建一个反应流(SpringReactor3Flux),以供客户端异步获取JMS消息。我相信我已经正确连接了所有内容,但在服务器停止之前,客户端不会接收任何JMS消息。然后,所有消息都被“推送”

  • 我有以下代码: 但它会导致编译错误,因为返回

  • 问题内容: 我在Java中有一个对象(基本上是VO),但不知道其类型。 我需要获取在该对象中不为null的值。 如何才能做到这一点? 问题答案: 你可以用来获取该类的所有声明的字段。你可以用来获取价值。 简而言之: 要了解有关反射的更多信息,请查看有关该主题的Sun教程。 就是说,这些字段不一定全部代表VO的属性。你希望确定以或开头的公共方法,然后调用它以获取真实属性值。 也就是说,可能会有更优雅