Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.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 Boot_Kotlin_Project Reactor - Fatal编程技术网

Spring boot 将单声道流转换为通量

Spring boot 将单声道流转换为通量,spring-boot,kotlin,project-reactor,Spring Boot,Kotlin,Project Reactor,我有一个REST控制器方法,它通过path变量接收ID列表: @GetMapping("/api/test/{ids}") fun findAllByIds(@PathVariable ids: Array<String>) = ... 到目前为止,这里最好的方法是向数据层添加findByIds(…)方法,这样它就可以在单个查询/请求中返回所需的值。这几乎肯定会比事后处理数据更有效率 如果你不能做到这一点,那么你有两个选择: 在循环中调用findById() 调用findAll(

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

@GetMapping("/api/test/{ids}")
fun findAllByIds(@PathVariable ids: Array<String>) = ...
到目前为止,这里最好的方法是向数据层添加
findByIds(…)
方法,这样它就可以在单个查询/请求中返回所需的值。这几乎肯定会比事后处理数据更有效率

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

  • 在循环中调用
    findById()
    
  • 调用
    findAll()
如果您必须使用上面的一种方法,效率更高取决于您的场景-如果传入了大量ID,并且
findAll()
返回的完整集合相对较小,那么调用
findAll()
并进行筛选可能是最好的方法

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


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

如果出于任何原因,您真的别无选择,只能使用
findAll()
,那么我认为您不能做得更好——但我觉得这不太可能。什么是
服务
?如果它是某种类型的数据存储库,那么几乎可以肯定的是,实现
findByIds()
方法或类似方法并在数据级别进行过滤将更加高效,而不是将其全部拉到
通量中
然后进行过滤。(旁白,我不确定标题是从哪里来的-我们似乎根本没有处理单声道,除非我遗漏了什么?@MichaelBerry谢谢你的评论。我有一个方法
findById(…)
。这将返回
Mono
。我希望迭代
数组
,得到
Mono
的“列表”,然后将其更改为
Flux
。我想您提到的方法更有意义——在
存储库中创建一个方法,返回
通量
对象。如果您想这样做,并从多个
findById()
调用中获得一个
Mono
s数组,那么您只需将该数组作为varargs参数传入即可。但是,如果可能的话,最好在数据层上实现
findByIds()
方法。包含
Mono[]
List
会被阻塞吗?整个练习的想法是使用反应性范式?@Prashant它只会依次订阅每个单声道-它根本没有阻塞。(如果是的话,我会给出一个明确的警告,因为正如你所说的,这一点从一开始就违背了使用反应堆的意义。)太好了!谢谢迈克尔的帮助。看起来我需要花更多的时间来阅读文档。@Prashant没问题。Reactor通常在某些东西阻塞时非常清晰——它的方法名中通常有
block
,并且(在所有情况下我都能找到)总是在方法Javadoc中提到它,通常用粗体!如果没有,您可以放心地假设它不会阻塞。
@GetMapping("/api/test/{ids}")
fun findAllByIds(@PathVariable ids: Array<String>) = service.findAll()
    .filter { ids.contains(testObject.id) }