Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/379.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 将内部Mono预创建为变量_Java_Project Reactor - Fatal编程技术网

Java 将内部Mono预创建为变量

Java 将内部Mono预创建为变量,java,project-reactor,Java,Project Reactor,假设简单的反应性流线: Flux.just(1, 2, 3, 4, 5) .flatMap(i -> Mono.just(i) .map( ... map some value) .flatMap( ... async call)

假设简单的反应性流线:

        Flux.just(1, 2, 3, 4, 5)
                .flatMap(i -> 
                        Mono.just(i)
                                .map( ... map some value)
                                .flatMap( ... async call)
                                .map(... more mappings)
                )
                .doOnNext(log::info)
                .blockLast()
        ;
假设父流
.flatMap()
中的Mono是具有复杂逻辑的复杂反应流。有没有办法将Mono保存为可以传递给父流的变量?换句话说,类似这样的事情:

final Function<Integer, Publisher<String>> monoPublisher = Mono.something()
                .map( ... map some value)
                .flatMap( ... async call)
                .map(... more mappings);

        Flux.just(1, 2, 3, 4, 5)
                .flatMap(monoPublisher)
                .doOnNext(log::info)
                .blockLast()
        ;

也许类似的方法可以奏效,只需将
LinkedList
替换为支持并发访问的更高级的工具即可:

Queue arguments=new LinkedList();
出版者费用出版者=
Mono.fromSupplier(参数::remove)
.map(…映射某些值)
.flatMap(…异步调用)
.map(…更多映射);
通量。只是(1,2,3)
.平面图(
我->{
加入(i);
返回昂贵的出版商;
})
.blockLast();

但它仍然感觉像一个黑客。如果内部确实有100个操作符,那么建议尝试在这一侧进行优化。这方面的改进可能会比重用
发布者
产生更大的影响,以避免重新创建发布者。

请查看reactor代码库中的
元组。您能否提供更多上下文,说明为什么天真的答案不合适?一般来说,为外部
通量
中的每个元素创建一个新的
单声道
并不重要。这听起来太复杂了。如果有一个
映射
,那么您肯定需要输入值,所以您的第二个代码片段。。。“只起作用”。@ESala-一般来说,这并不重要,但如果您的内部Mono有100个操作符,并且是以编程方式构建的,该怎么办呢。为外部通量中的每个元素构建它是非常低效的。如果已经构建了Mono,那么创建的唯一对象就是一个新的订阅,那么效率会更高。当您让每台服务器处理>15K请求/秒时,我们需要使用任何性能优化,垃圾收集也是一个问题。谢谢。不知道Mono.fromSupplier调用supplier来获取每个订阅的价值,我认为它在组装时调用一次。这会奏效的。我同意这仍然是一个有点黑客,但它的代码比我写的包装少很多。
final Function<Integer, Publisher<String>> monoPublisher = i -> Mono.just(i) ...