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

Java webflux/reactor--用只在mono中找到的项过滤一个flux

那昊
2023-03-14

我是WebFlux/Reactor的新手,很难考虑如何编写这段代码。基本上,我有一个流量,它有一个嵌套的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)));

上面代码块的问题是包含()上的.block(),我不想阻止。不确定如何将其更改为无阻塞,但仍然检查bar是否包含烫发项。

共有1个答案

贺运良
2023-03-14

要直接回答这个问题-不要使用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,这是流量本身,因此没有合理的情况会出现这种情况。

  •  类似资料:
    • 我有一个函数返回,我想将它映射到(因为这是我在控制器方法中返回的东西)。 是否有更好的方法返回而不是? 我不能使用,因为映射函数不能接受s。

    • 使用阻塞运算符,我可以这样做:

    • 假设我有以下流程 只是为了理解 因此,我有 但我需要 继续皱眉 这个问题有什么好的解决办法吗?

    • 问题内容: 我有一个过滤器linkifyStuff,其中需要使用其他过滤器处理一些变量。我无法弄清楚从另一个调用一个过滤器的语法。 我了解过滤器链接-这不是我想要的。我想将过滤器应用于linkifyStuff过滤器中的局部变量,而不是其输入或输出。 我希望像下面这样工作,但是$ filter(’filtername’)显然不是正确的语法。 我可以为sanitizeStuff和sanitizeStu

    • 我正在寻找一种方法来检索替代单声道,以防原始单声道是空的。我找到的最接近的是,但我的问题是,我无法将lambda表达式传递给它,因此即使Mono具有非空值,也会调用它。这有点像vs。 以下是一个示例:

    • null 这段代码似乎工作正常,并允许我处理admin guild命令,即由“权限级别”(最高角色级别)至少是我指定的一个的成员在我的Discord服务器的文本通道中发送的命令。 但是如何正确地(反应性地、好地)实现其余的命令呢?我在Reactor中没有找到类似if/else链接的东西,我也不想重复以上代码几次,只更改1-2行。