Mono<T>
和 Flux<T>
作为函数参数的用例是什么。
代码
Flux<String> findByLastName(Mono<String> lastname) {
//implementation
}
当我从休息中调用上述方法时,与不使用
String.class
作为参数会有什么区别?
回答您的第一个评论问题:
@ErwinBolwidt 我知道 Mono/Flux 在计算中的用例,但我不明白具体将其用作方法参数 – Bibek Shakya
当您将它用作参数时,您必须将其作为流处理(这意味着您还没有它),因此例如您永远不应该说lastname.block(),因为这意味着您刚刚阻塞了线程直到该值可用。
免责声明额外信息
如果您问从现在开始是否应该将任何内容包装在 Mono 或 Flux 中,那么当然不应该,因为它给方法和调用者增加了不必要的复杂性。
从设计角度来看,答案很简单,只需提出基本问题即可:
所以我们不应该想到谁在使用该方法并试图使该方法对他来说方便,而实际上我们应该想到该方法的需求。
一个用例是当方法实际上需要这种方式的参数时;这意味着您实际上在内部进行流处理,例如您的方法接受无限的传感器数据流,并且内部的方法变得疯狂,如下所示:
Flux<Point> processSensor(Flux<Double> data){
return data.filter(blabla).zipWith(blabla).map(...);
}
Mono<String> lastname
首先来自哪里?
想象一下,你还有另一种方法,像这样:
Mono<String> findLastNameById(Long id) {
// implementation
}
现在,如果您的示例中有该方法,则可以通过传递 Mono 作为输入参数来使用它:
Flux<String> findByLastName(Mono<String> lastname) {}
// Usage Mono as input parameter:
return findByLastName(
findLastNameById(id)
);
但是,在反应式编程中更惯用的做法是避免将
Mono
或 Flux
作为参数传递。相反,您应该使用 flatMap
等方法来链接操作。因此,首选用法是:
Flux<String> findByLastName(String lastname) {}
// Use it like this:
return findLastNameById(id)
.flatMap(this::findByLastName);
只有用例我能想到为什么方法参数是
Mono<String> lastname
lastname
为此,方法的返回类型必须是 org.reactivestreams.Publisher(即 Mono/Flux)。