Mono<T> 和 Flux<T> 作为函数中的参数
Mono<T> and Flux<T> as a parameter in function
Mono<T>
和 Flux<T>
作为函数参数的用例是什么。
代码
Flux<String> findByLastName(Mono<String> lastname) {
//implementation
}
当我从 rest 调用上述方法时,与不使用 String.class
作为参数有什么区别?
只有用例我能想到为什么一个方法参数是Mono<String> lastname
- 从 WebClient/Router 类型的函数中检索到
- @Secured("ROLE_EVERYONE") 在之前的方法中用于检索
lastname
For this to work the return type of the method must be a
org.reactivestreams.Publisher (i.e. Mono/Flux).
回答您的第一个评论问题:
@ErwinBolwidt i know use case for Mono/Flux in computation but i dont understand specifically using it as method parameter – Bibek Shakya
当你将它用作参数时,你必须将它作为一个流来处理(意味着你还没有它)所以例如你永远不应该说 lastname.block(),因为这意味着你在该值可用之前刚刚阻塞线程。
免责声明额外信息
如果您问是否应该从现在开始将任何东西包装在 Mono 或 flux 中,那么当然不是,因为它给方法和调用者增加了不必要的复杂性。
从设计的角度来看,答案很简单,只需问一些基本问题:
- 一般什么时候使用单声道?
- 好吧,当你还没有价值的时候。
- 一般什么时候使用 Flux?
- 好吧,当你有数据流来或不来时。
所以我们不要想着谁在用这个方法,尽量让方法方便他使用,而实际上我们应该想到方法的需要。
一个用例是当方法实际上需要这种方式的参数时;这意味着您实际上在内部进行流处理,例如您的方法接受无限的传感器数据流,并且内部方法变得疯狂,如:
Flux<Point> processSensor(Flux<Double> data){
return data.filter(blabla).zipWith(blabla).map(...);
}
Mono<T>
和 Flux<T>
作为函数参数的用例是什么。
代码
Flux<String> findByLastName(Mono<String> lastname) {
//implementation
}
当我从 rest 调用上述方法时,与不使用 String.class
作为参数有什么区别?
只有用例我能想到为什么一个方法参数是Mono<String> lastname
- 从 WebClient/Router 类型的函数中检索到
- @Secured("ROLE_EVERYONE") 在之前的方法中用于检索
lastname
For this to work the return type of the method must be a org.reactivestreams.Publisher (i.e. Mono/Flux).
回答您的第一个评论问题:
@ErwinBolwidt i know use case for Mono/Flux in computation but i dont understand specifically using it as method parameter – Bibek Shakya
当你将它用作参数时,你必须将它作为一个流来处理(意味着你还没有它)所以例如你永远不应该说 lastname.block(),因为这意味着你在该值可用之前刚刚阻塞线程。
免责声明额外信息
如果您问是否应该从现在开始将任何东西包装在 Mono 或 flux 中,那么当然不是,因为它给方法和调用者增加了不必要的复杂性。
从设计的角度来看,答案很简单,只需问一些基本问题:
- 一般什么时候使用单声道?
- 好吧,当你还没有价值的时候。
- 一般什么时候使用 Flux?
- 好吧,当你有数据流来或不来时。
所以我们不要想着谁在用这个方法,尽量让方法方便他使用,而实际上我们应该想到方法的需要。
一个用例是当方法实际上需要这种方式的参数时;这意味着您实际上在内部进行流处理,例如您的方法接受无限的传感器数据流,并且内部方法变得疯狂,如:
Flux<Point> processSensor(Flux<Double> data){
return data.filter(blabla).zipWith(blabla).map(...);
}