Mono<T> 和 Flux<T> 作为函数中的参数

问题描述 投票:0回答:3

Mono<T>
Flux<T>
作为函数参数的用例是什么。

代码

Flux<String> findByLastName(Mono<String> lastname) {
   //implementation
}

当我从休息中调用上述方法时,与不使用

String.class
作为参数会有什么区别?

java project-reactor
3个回答
3
投票

回答您的第一个评论问题:

@ErwinBolwidt 我知道 Mono/Flux 在计算中的用例,但我不明白具体将其用作方法参数 – Bibek Shakya

当您将它用作参数时,您必须将其作为流处理(这意味着您还没有它),因此例如您永远不应该说lastname.block(),因为这意味着您刚刚阻塞了线程直到该值可用。


免责声明额外信息

如果您问从现在开始是否应该将任何内容包装在 Mono 或 Flux 中,那么当然不应该,因为它给方法和调用者增加了不必要的复杂性。

从设计角度来看,答案很简单,只需提出基本问题即可:

  • 一般什么时候使用 Mono ?
    • 好吧,当你还没有价值的时候。
  • 一般什么时候使用 Flux ?
    • 好吧,当你有或没有数据流时。

所以我们不应该想到谁在使用该方法并试图使该方法对他来说方便,而实际上我们应该想到该方法的需求。

一个用例是当方法实际上需要这种方式的参数时;这意味着您实际上在内部进行流处理,例如您的方法接受无限的传感器数据流,并且内部的方法变得疯狂,如下所示:


Flux<Point> processSensor(Flux<Double> data){
    return data.filter(blabla).zipWith(blabla).map(...);
}


0
投票

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);

-1
投票

只有用例我能想到为什么方法参数是

Mono<String> lastname

  1. 从 WebClient/Router 类型函数检索
  2. @Secured("ROLE_EVERYONE") 在之前的方法中用于检索
    lastname

为此,方法的返回类型必须是 org.reactivestreams.Publisher(即 Mono/Flux)。

© www.soinside.com 2019 - 2024. All rights reserved.