我有以下界面:
interface Checker {
Mono<Foo> check(Bar bar);
}
另请注意,Bar
有一个方法getPizzas()
:
class Bar {
List<Pizza> getPizzas() { ... }
}
在某些情况下,实现类通过使用启用了响应的HTTP客户端来使用非阻塞IO操作的好处。
但是,在其他情况下,没有IO操作,所以我只想使用一个方法transform
,它接受List<Pizza>
并返回一个Foo
的实例,并将其作为Mono<Foo>
返回。
transform
的签名是:
Foo transform(List<Pizza> pizzas) { ... }
根据我的理解,我有两个选项(可能更多)来实现这样的Checker:
选项[1.a] - 尽可能使用反应流方法:
Mono<Foo> check(Bar bar) {
return Flux.fromIterable(bar.getPizzas()).collectList().map(pizzas -> transform(pizzas));
}
选项[1.b] - 与[1.a]几乎相同:
Mono<Foo> check(Bar bar) {
return Mono.just(bar.getPizzas()).map(pizzas -> transform(pizzas));
}
选项[2] - 使用纯Java进行内存转换:
Mono<Foo> check(Bar bar) {
return Mono.just(transform(bar.getPizzas()));
}
我的问题:
上述选项有区别吗?
如果map
是CPU密集型并且需要花费大量时间(例如,超过2秒),那么使用反应性transform
是否会更好?
除非您对每个Pizza进行转换,否则没有理由使用Flux。此外,您提供的每种方法都将完全相同。如果您担心CPU密集型操作,则应使用Parallel线程池订阅该操作,以卸载工作并释放事件循环线程。
Mono.just(bar.getPizzas())
.map(pizzas -> transform(pizzas))
.subscribeOn(Schedulers.parallel())