filter与flatMap结合使用会在Reactor中引发异常

时间:2017-08-22 18:24:15

标签: java project-reactor

我想过滤所有值满足特定条件的窗口,然后打印出过滤后的助焊剂:

Flux.just(4, 2, 6, 4, 5, 6, 7, 8, 9)
        .window(3)
        .filterWhen(window -> window.all(n -> n % 2 == 0))
        .flatMap(window -> window)
        .subscribe(System.out::println);

但结果不是4, 2, 6而是

java.lang.IllegalStateException: UnicastProcessor allows only a single Subscriber.

如果我尝试相同但没有filterWhen它会毫无例外地运作:

Flux.just(4, 2, 6, 4, 5, 6, 7, 8, 9)
        .window(3)
        .flatMap(window -> window)
        .subscribe(System.out::println);

如果我在没有flatMap的情况下尝试,也不会抛出任何异常:

Flux.just(4, 2, 6, 4, 5, 6, 7, 8, 9)
        .window(3)
        .filterWhen(window -> window.all(n -> n % 2 == 0))
        .subscribe(System.out::println);

然而,这两种方法显然都不会产生预期的结果。但filterWhenflatMap 的组合似乎存在问题!

我的第一个例子有什么问题?另一个用户在哪里?

我如何获得价值?

1 个答案:

答案 0 :(得分:1)

这目前无法实现,因为window只能订阅("消费")一次。 flatMapfilterWhen都会订阅该窗口,因此您的错误。

您可以做的是使用buffer(3)而不是window(3),过滤缓冲区,然后从通过过滤器的缓冲区中发出值:

Flux.just(4, 2, 6, 4, 5, 6, 7, 8, 9)
    .buffer(3)
    .filter(list -> list.stream().allMatch(n -> n % 2 == 0))
    .flatMapIterable(Function.identity())
    .subscribe(System.out::println);