Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/335.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
Java WebFlux/反应器-过滤a通量<;列表<;字符串>&燃气轮机;仅在Mono中找到的项目<;设置<;字符串>&燃气轮机;_Java_Spring Webflux - Fatal编程技术网

Java WebFlux/反应器-过滤a通量<;列表<;字符串>&燃气轮机;仅在Mono中找到的项目<;设置<;字符串>&燃气轮机;

Java WebFlux/反应器-过滤a通量<;列表<;字符串>&燃气轮机;仅在Mono中找到的项目<;设置<;字符串>&燃气轮机;,java,spring-webflux,Java,Spring Webflux,我是WebFlux/Reactor的新手,很难理解如何编写这段代码。基本上,我有一个Flux,它有一个嵌套的列表foo和一个monobar,我只想返回foo中包含在bar中的项 // these two lines are representations of what the data looks like Flux<CategoryModel> foo = { Permissions = [ "UserRole1"] } // List<String&g

我是WebFlux/Reactor的新手,很难理解如何编写这段代码。基本上,我有一个Flux,它有一个嵌套的列表foo和一个monobar,我只想返回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)));
//这两行表示数据的外观
Flux foo={Permissions=[“UserRole1”]}//List
单杠=[“UserRole1”,“UserRole2”];
var filteredFoo=foo.filter(m->m.getPermissions().stream().anyMatch(perm->bar.block().contains(foo));

上述代码块的问题是
包含()
上的
.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
    ,因此在任何合理的情况下都不会出现这种情况


要直接回答问题-不要使用
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
    ,因此在任何合理的情况下都不会出现这种情况


您需要知道单声道的最终内容,以便过滤流量,因此只需等待:

var filteredFoo=bar.flatMapMany(b->foo.filter(f->f.getPermissions().stream().anyMatch(b::contains));

您需要知道mono的最终内容,以便过滤流量,所以只需等待:

var filteredFoo=bar.flatMapMany(b->foo.filter(f->f.getPermissions().stream().anyMatch(b::contains));

谢谢Michael,这个解决方案奏效了,我的代码有点不同,所以我理解您在最后一点中关于检查集合是否直接包含foo的意思。感谢您在这方面的及时帮助,真的需要更舒适地使用webflux。@MannfromReno无需担心,很乐意提供帮助。Webflux/Responsive是一种不同的东西——它确实需要一些时间来适应和一种完全不同的编程风格,所以如果你在开始时错过了这样的东西,当然不要感到难过!谢谢Michael,这个解决方案成功了,我的代码有点不同,所以我理解您在最后一点中关于检查集合是否直接包含foo的意思。感谢您在这方面的及时帮助,真的需要更舒适地使用webflux。@MannfromReno无需担心,很乐意提供帮助。Webflux/Responsive是一种不同的东西——它确实需要一些时间来适应和一种完全不同的编程风格,所以如果你在开始时错过了这样的东西,当然不要感到难过!谢谢你的回答,我也来试试。谢谢你的回答,我也来试试。