Java WebFlux/Reactor - 使用仅在 Mono<Set<String>> 中找到的项目过滤 Flux<List<String>>

标签 java spring-webflux

我是 WebFlux/Reactor 的新手,无法理解如何编写这段代码。基本上,我有一个 Flux,它有一个嵌套的 List foo 和一个 Mono bar,我只想返回 foo 中包含在 bar 中的项目。

// these two lines are representations of what the data looks like
Flux<CategoryModel> foo = { Permissions = [ "UserRole1"] } // List<String>
Mono<Set<String>> bar = [ "UserRole1", "UserRole2" ]; 

var filteredFoo = foo.filter(m -> m.getPermissions().stream().anyMatch(perm -> bar.block().contains(foo)));

上面代码块的问题是 contains() 上的 .block() 而我不想阻塞。不确定如何将其更改为非阻塞但仍检查栏是否包含永久项。

最佳答案

要直接回答问题 - 不要使用 filter(),使用 filterWhen(),它根据发布者而不是设置值进行过滤:

foo.filterWhen(m -> bar.map(set -> m.getPermissions().stream().anyMatch(perm -> set.contains(foo))));

请注意,您编写的代码有点奇怪,我只是直接翻译了它 - 但由于以下几个原因,目前它没有多大意义:

  • 您正在传输权限,但目前并未在您的 anyMatch() lambda 中实际使用权限 - 因此目前您的代码可以简化为:

    foo.filterWhen(m -> bar.map(set -> set.contains(foo)));
    
  • 即使给出上述情况,您仍在检查您的集合是否包含 foo,这是通量本身,因此没有合理的情况可以证明这是真的。

关于Java WebFlux/Reactor - 使用仅在 Mono<Set<String>> 中找到的项目过滤 Flux<List<String>>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66804194/

相关文章:

java - 按第一个元素对对象列表进行排序,但如果相等则按第二个元素排序

spring-webflux - 如何在 Flux 中迭代一个对象并对其进行操作?

java - 使用 WebFlux 对特定映射进行并行 GET 请求

react 堆栈中的 Firebase ApiFuture 到 CompletableFuture

spring - 我可以在没有 Webflux 的情况下使用独立的 WebClient 吗

java - 错误 : Could not find or load main class simon. 游戏

java - 如何获取时间戳 token 并将其应用于PDF文件?

java - 文件textFile.txt未找到异常

java - 与Java编程的混淆

vue.js - 如何将 RSocket 数据检索到不同的选项卡?