首页 > 解决方案 > 将 Mono 流转换为 Flux

问题描述

我有一个 REST 控制器方法,它通过路径变量接收 ID 列表:

@GetMapping("/api/test/{ids}")
fun findAllByIds(@PathVariable ids: Array<String>) = ...

从存储库中,我想发送一个Flux基于 id 的匹配对象。做到这一点的基本方法是什么。我可以做一个基于过滤器的操作,findAll()还是有更好的方法来处理这个?

@GetMapping("/api/test/{ids}")
fun findAllByIds(@PathVariable ids: Array<String>) = service.findAll()
    .filter { ids.contains(testObject.id) }

标签: spring-bootkotlinproject-reactor

解决方案


到目前为止,最好的方法是向您的数据层添加一个findByIds(...)方法,这样它就可以在单个查询/请求中返回您需要的值。这几乎肯定会比事后处理数据更有效率。

如果你不能这样做,那么你有两个选择:

  • 调用findById()一个循环来获得一个List<Mono>Mono[],然后使用静态Flux.concat()方法将它变成一个Flux;
  • 打电话findAll(),然后在你的问题中进行过滤。

如果您必须使用上述方法之一,这取决于您的场景 - 在传入大量 ID 并且返回的完整集findAll()相对较小的情况下,那么调用findAll()和过滤可能是最好的。

另一方面,如果传入的ID相对较少,并且完整的数据集很大,那么您最好findById()在循环中调用。

然而,重申一下 - 上述两种方法都不如在数据层上处理这个问题。


推荐阅读