当前位置: 首页 > 知识库问答 >
问题:

如何从返回单声道的流中创建通量?[副本]

邵璞
2023-03-14

想象一下,我有一个CourseID对象列表(CourseID,Name)。让我们把这个列表称为'CourseNameList'。

当某人将请求发送到“

然而,在发送结果之前,我还需要追加每个课程的价格。价格将从另一个微服务中检索,并返回Mono对象。

因此,用户将看到带有(ID、名称、价格)的课程列表。价格来源于其他服务。

控制器方法可能如下所示

@GetMapping("/courses")
public Flux<Course> gerProducts() {
 courseNameList.stream.map(courseName -> {
      //Make a webClient call to pricing service by sending coureName.getID as parameter and get the 'price' Mono object
      //return the course object with id, name, price
   })
     //Collect and return Flux with contains list of courses!
}

我尝试了多种方法来返回Flux。但是,我不知道怎么做。我需要用等效的(或者更好的)代码替换这些注释。

共有2个答案

呼延德华
2023-03-14

你可以看看这个例子,自己想出一个解决方案。

// I assumed you have courses list already as you are using a list.
 List<String> list = List.of("a", "bb", "ccccc", "ddd");
 Flux.fromIterable(list)
       // this is where you find the price and append
       .flatMap(a -> Mono.just(a).map(k -> k + ":" + k.length()))                 
       .subscribe(System.out::println);

//output
a:1
bb:2
ccccc:5
ddd:3

但是,如果你有100门课程,你会想一个接一个地打100个电话给这项服务吗。它不会影响性能吗?相反,你能在一次通话中发送课程列表并从服务中获得价格吗?

// you have courses list
List<String> list = List.of("a", "bb", "ccccc", "ddd");

// get the price of all courses in 1 call
Mono.fromSupplier(() -> List.of(1, 2, 5, 3))
        .flatMapIterable(Function.identity())
        .index()
        // map the courses and price
        // I used index. but you could use courseID to map the price
        .map(t -> list.get(t.getT1().intValue()) + ":" + t.getT2())
        .subscribe(System.out::println);
澹台华晖
2023-03-14

从通量开始,而不是从列表开始会更好,但是如果不可能,那么从下面的流创建通量,然后使用flatMap而不是map。

@GetMapping("/courses")
public Flux<Course> gerProducts() {
  return Flux.fromStream(courseNameList.stream()).flatMap(courseName -> {
    // Make webClient call which returns mono
  });
}
 类似资料:
  • 我有一个例子,我想使用通量。生成,因为我不想进行昂贵的阻塞呼叫,除非/直到用户提出要求。具体来说,我多次调用Elasticsearch(有效地进行分页),直到没有更多点击。我在迭代器中使用标准的阻塞调用实现了这一点 下面是前面使用阻塞的代码: 上面的工作原理很好,因为它等待对ES进行下一次调用,直到(该)订阅者准备好接收下一个数据块。 在下面,我尝试使用Spring的,但问题是在订阅者处理第一个之

  • 我的REST控制器方法应该返回Mono,它必须由两个并行请求构建到另一个web服务,并处理它们的响应,其中一个请求返回Mono,另一个请求返回Flux 如何将单声道的响应与熔剂的响应结合起来进行处理? 显然,控制器是错误的,因为: 1)接受2个或更多的Mono,其中我有Mono和Flux-如何将它们组合起来? 2)也不确定: 是否正确? 有什么建议吗?

  • 我有一个类,它从通量源填充地图。我希望能够动态地更新thedata(),但我希望能够返回解析为当前或挂起数据的Mono。 基本上如果数据!=null和no in progress flux,返回Mono。仅返回(数据),否则返回最终将发出数据的单声道。 编辑:这是目前为止我能做的最好的了 但是仍然存在一个问题,在第一次完成updateTheData()之前,

  • 我如何传递我的异常,以便使用者将看到我在单声道中传递的原始异常?希望我的问题很清楚,提前谢谢

  • 我有一个方法,可以尝试使用WebClient返回Mono 它可以返回我期望的结果。然后我尝试创建另一个方法来支持列表作为参数 但这一次返回一个奇怪的结果。 我是反应式编程新手,将流和单声道结合起来,然后转换为流量的正确方法是什么?

  • 我的代码如下。我需要从mongo db获得每次旅行的车费,然后将每次旅行的所有车费相加,得到总车费。我被一种我不知道如何阅读的单声道音乐所困扰。我试着把它转换成通量,但我得到了通量 "'