Java 反应器:通量<;对象>。订阅()与..toStream()的比较

Java 反应器:通量<;对象>。订阅()与..toStream()的比较,java,flux,reactor,spring-reactive,Java,Flux,Reactor,Spring Reactive,我有一个函数:Flux queryPerson(),它查询数据库以生成对象并在Flux中返回它们。当我使用.subscribe()时,应用程序只需运行代码并退出。它不会等待查询结果返回。但是当我使用.toStream()阻止流时,我可以看到打印输出。我做错了什么 personRepository .queryPerson() .map(x -> x.getFirst().concat("ok")) .subscribe(i -> System.out.prin

我有一个函数:Flux queryPerson(),它查询数据库以生成对象并在Flux中返回它们。当我使用.subscribe()时,应用程序只需运行代码并退出。它不会等待查询结果返回。但是当我使用.toStream()阻止流时,我可以看到打印输出。我做错了什么

personRepository
    .queryPerson()
    .map(x -> x.getFirst().concat("ok"))
    .subscribe(i -> System.out.println(i))
    //.toStream().forEach(System.out::println)
;

我假设您没有某种web应用程序,而是一个命令行运行程序或简单的java应用程序。考虑到应用程序在异步任务之前完成是正常的

订阅 订阅是一种使用传入数据的异步方式,在订阅了Flux之后,立即将控制权返回给调用线程

这正是反应式编程的工作方式,您定义了行为,您有很好的抽象方式在其他线程和调用线程中运行它

正如它在

由于序列可以是异步的,因此会立即返回 控件添加到调用线程。这给人的印象是 在主线程或单元测试中执行时不会调用使用者 比如说

.toStream 另一方面,使用.toStream您会收到一个Java流,即使它的大小未知,您仍然会像普通Java流一样以同步方式迭代它


更多的解释可以在

中找到,我假设您没有某种web应用程序,而是一个命令行运行程序或简单的java应用程序。考虑到应用程序在异步任务之前完成是正常的

订阅 订阅是一种使用传入数据的异步方式,在订阅了Flux之后,立即将控制权返回给调用线程

这正是反应式编程的工作方式,您定义了行为,您有很好的抽象方式在其他线程和调用线程中运行它

正如它在

由于序列可以是异步的,因此会立即返回 控件添加到调用线程。这给人的印象是 在主线程或单元测试中执行时不会调用使用者 比如说

.toStream 另一方面,使用.toStream您会收到一个Java流,即使它的大小未知,您仍然会像普通Java流一样以同步方式迭代它


更多解释请参见

谢谢您的回答。你是对的。我只是在控制台中运行一个普通的java应用程序。这是否意味着我只能在none web应用程序中使用toStream()?subscribe背后的全部思想是不要阻塞主线程等待答案。例如,假设在web应用程序中,您进行了一些繁重的数据库查询,然后返回给客户机并给出答案,非阻塞/反应性代码是可行的,但由于您有一个主线程,并且它在打印之前就结束了(程序结束),所以您根本看不到它们。如果你有一个运行时间更长的程序,你会看到这些打印,我不知道你的案例是一个真正的应用程序还是一个培训应用程序,只需使用toStream并迭代它就可以看到结果。互联网上有一篇关于反应式编程的非常流行的文章,我强烈建议您至少阅读它的第一部分@topcan5。与其说您需要一个Web应用程序,还不如说您需要一个更复杂的应用程序来真正了解反应式编程的好处。基本上,您需要一个寿命更长的应用程序,将工作转移到后台是有意义的。一个明显的例子是Web应用程序;另一个是桌面GUI应用程序。谢谢你的回答。你是对的。我只是在控制台中运行一个普通的java应用程序。这是否意味着我只能在none web应用程序中使用toStream()?subscribe背后的全部思想是不要阻塞主线程等待答案。例如,假设在web应用程序中,您进行了一些繁重的数据库查询,然后返回给客户机并给出答案,非阻塞/反应性代码是可行的,但由于您有一个主线程,并且它在打印之前就结束了(程序结束),所以您根本看不到它们。如果你有一个运行时间更长的程序,你会看到这些打印,我不知道你的案例是一个真正的应用程序还是一个培训应用程序,只需使用toStream并迭代它就可以看到结果。互联网上有一篇关于反应式编程的非常流行的文章,我强烈建议您至少阅读它的第一部分@topcan5。与其说您需要一个Web应用程序,还不如说您需要一个更复杂的应用程序来真正了解反应式编程的好处。基本上,您需要一个寿命更长的应用程序,将工作转移到后台是有意义的。一个明显的例子是Web应用程序;另一个是桌面GUI应用程序。