我想过滤所有值满足特定条件的窗口,然后打印出过滤后的助焊剂:
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);
然而,这两种方法显然都不会产生预期的结果。但filterWhen
和flatMap
的组合似乎存在问题!
我的第一个例子有什么问题?另一个用户在哪里?
我如何获得价值?
答案 0 :(得分:1)
这目前无法实现,因为window
只能订阅("消费")一次。 flatMap
和filterWhen
都会订阅该窗口,因此您的错误。
您可以做的是使用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);