Java 项目反应器中反应流的内存转换

Java 项目反应器中反应流的内存转换,java,reactive-programming,blocking,project-reactor,in-memory,Java,Reactive Programming,Blocking,Project Reactor,In Memory,我有以下界面: interface Checker { Mono<Foo> check(Bar bar); } 在某些情况下,实现类利用非阻塞IO操作的优点,通过使用一个支持反应的HTTP客户机 但是,在其他情况下,没有IO操作,因此我只想使用一个方法transform,该方法接受List,并返回Foo的实例,并将其作为Mono返回 transform的签名是: Foo transform(List<Pizza> pizzas) { ... } Foo转换(列出比

我有以下界面:

interface Checker {
  Mono<Foo> check(Bar bar);
}
在某些情况下,实现类利用非阻塞IO操作的优点,通过使用一个支持反应的HTTP客户机

但是,在其他情况下,没有IO操作,因此我只想使用一个方法
transform
,该方法接受
List
,并返回
Foo
的实例,并将其作为
Mono
返回

transform
的签名是:

Foo transform(List<Pizza> pizzas) { ... }
Foo转换(列出比萨饼){…}
据我所知,我有两个选项(可能更多)来实现这种检查器:

选项[1.a]-尽可能使用反应流方法:

Mono<Foo> check(Bar bar) {
  return Flux.fromIterable(bar.getPizzas()).collectList().map(pizzas -> transform(pizzas));
}
Mono检查(条形){
返回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));
}
Mono检查(条形){
返回Mono.just(bar.getPizzas()).map(pizzas->transform(pizzas));
}
选项[2]-使用纯Java进行内存转换:

Mono<Foo> check(Bar bar) {
  return Mono.just(transform(bar.getPizzas()));
}
Mono检查(条形){
返回Mono.just(transform(bar.getPizzas());
}
我的问题:

上述选项是否存在差异


如果
transform
是CPU密集型的,并且需要大量时间(比如超过2秒),那么使用反应式
map
是否是一种更好的方法?

除非您对每个比萨饼执行转换,否则没有理由使用Flux。此外,您提供的每个方法都将执行完全相同的操作。如果您担心CPU密集型操作,那么应该使用并行线程池订阅该操作,以卸载工作并释放事件循环线程

Mono.just(bar.getPizzas())
   .map(pizzas -> transform(pizzas))
   .subscribeOn(Schedulers.parallel())

根据我的理解,所有的方法都做完全相同的事情。在选项1中,您使用的是map操作符,它对昂贵的函数进行同步调用。类似地,在选项2中,调用transform函数来变换对象,然后从结果中创建通量。所有这些基本上都是一样的。您应该使用flatMap而不是map来异步执行密集的工作。@uneq95
flatMap
不是异步的。选项1允许您延迟执行,并使用
subscribeOn
publishOn
异步运行它,例如@better oliver?平面图不是异步的吗?为什么文件上说的恰恰相反?Flatmap:“将此流量发出的元素异步转换为发布者”。你能对此发表评论吗?我对这一点的理解怎么是错误的?
Mono.just(bar.getPizzas())
   .map(pizzas -> transform(pizzas))
   .subscribeOn(Schedulers.parallel())