我有一个函数:Flux queryPerson(),它查询数据库以生成对象并以Flux返回它们。当我使用.subscribe()时,该应用程序仅通过代码运行并退出。它不等待结果返回查询。但是当我使用.toStream()阻止流时,我可以看到打印输出。我在做什么错了?
public static String converter(String userInput) {
String endProduct = "";
char c = userInput.charAt(0);
Stack<Character> stack = new Stack<Character>();
int len = userInput.length();
//iterates through the word to find symbols and letters, if letter or digit it appends to endProduct, if symbol it pushes onto stack
for (int i = c; i < len; i++) {
if (Character.isLetter(userInput.charAt(i))) {
endProduct = endProduct + c;
System.out.println(c);
}//end if
else if(Character.isDigit(userInput.charAt(i))){
endProduct = endProduct + c;
System.out.println(c);
}
答案 0 :(得分:2)
我假设您没有某种Web应用程序,而是命令行运行器或简单的Java应用程序。考虑到应用程序在异步任务之前完成是正常的。
订阅是一种使用传入数据的异步方法,在Flux上订阅后,您立即将控制权返回给调用线程。
这正是反应式编程的工作原理,定义行为,在其他一些线程中以及与调用线程一起运行它的抽象方法。
如Flux docs中所述
由于序列可以是异步,因此它将立即返回 控制到调用线程。这可以给人的印象 在主线程或单元测试中执行时,不会调用使用者 例如。
另一方面,通过 .toStream 您会收到一个Java Stream,即使它的大小未知,您仍然可以像普通Java Stream一样以同步方式对其进行迭代。
更多说明,请参见.toStream docs of Flux