Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/378.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/15.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.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 如何从其他焊剂中排除焊剂中的所有元素_Java_Spring_Stream_Project Reactor - Fatal编程技术网

Java 如何从其他焊剂中排除焊剂中的所有元素

Java 如何从其他焊剂中排除焊剂中的所有元素,java,spring,stream,project-reactor,Java,Spring,Stream,Project Reactor,我有两个通量,一个是成功的元素,另一个是错误的元素 Flux<String> success= Flux.just("Orange", "Apple", "Banana","Grape", "Strawberry"); Flux<String> erroneous = Flux.just("Banana","Grape",); Flux success=Flux.just(“橙色”、“苹果”、“香蕉”、“葡萄”、“草莓”); 通量错误=Flux.just(“香蕉”、“葡

我有两个通量,一个是成功的元素,另一个是错误的元素

Flux<String> success= Flux.just("Orange", "Apple", "Banana","Grape", "Strawberry");
Flux<String> erroneous = Flux.just("Banana","Grape",);
Flux success=Flux.just(“橙色”、“苹果”、“香蕉”、“葡萄”、“草莓”);
通量错误=Flux.just(“香蕉”、“葡萄”);

如何过滤第一个<代码>通量>代码>从第二个元素中执行所有元素?

< p>您可以考虑将<代码>通量>代码>集合,缓存该集合,然后使用<代码>文件> 如下:

Mono<Set<String>> erroneousSet = erroneous.collect(Collectors.toSet()).cache();
Flux<String> filtered = success.filterWhen(v -> erroneousSet.map(s -> !s.contains(v)));
success.filterWhen(s -> erroneous.hasElement(s).map(x->!x))
这不是最简洁的解决方案(见下文),但它可以缓存
错误的内容。在这个具体的例子中,这是一个没有实际意义的问题,但是如果这是一个真实的情况(不使用
Flux.just()
),那么
错误的
可能会在每个订阅上重新计算,这在性能方面可能会非常昂贵(而且不必要)

或者,如果上述内容在您的用例中真的无关紧要,
filterWhen()
haseelement()
可以更简洁地使用,如下所示:

Mono<Set<String>> erroneousSet = erroneous.collect(Collectors.toSet()).cache();
Flux<String> filtered = success.filterWhen(v -> erroneousSet.map(s -> !s.contains(v)));
success.filterWhen(s -> erroneous.hasElement(s).map(x->!x))
或使用额外的反应堆:

success.filterWhen(s -> BooleanUtils.not(erroneous.hasElement(s)))

只有一个词,完美理想情况下,会有一个
hasNoElement()
或类似的方法来避免最后的
map()
调用,但这是目前最好的解决方法:-)@MeladBasilius刚刚有了一个脑波,如果你碰巧已经有了
reactor extra
的话,就会用一个稍微不同的替代方法进行更新。不过,仅仅为了这个目的而包含它并没有多大意义。请注意,如果您有机会首先收集要在
集合中排除的元素,然后改用
.filter(…)
,则为此目的使用
通量可能有点不适合。特别是如果每次订阅时都重新计算
错误
,并且
只是
用于演示only@SimonBasl这是一个很好的观点。我想如果
Flux
是唯一可用的源(假设它终止),那么更好的选择可能是作为集合收集和缓存,即
errorset=error.collect(Collectors.toSet()).cache()
success.filterWhen(v->errorset.map(s->!s.contains(v)))
-这有意义吗,还是我错过了更简洁的方式?