什么是分组助焊剂?如何与之一起使用?

时间:2019-06-07 13:03:26

标签: java spring reactive-programming spring-webflux project-reactor

我正在处理某个对象的助焊剂,比如说Flux < MovieReservation >。其中包含电影ID,名称,时间,标题等信息。因此,我想提取有助于创建新
Flux < MovieShowDetail >的信息。我的意图是按电影ID将所有保留分组,并将通量分解为一组较小和多个通量(如果有的话,则通量)。

Flux {
   movie1 -> Flux<MovieShowDetail>
   movie2 -> Flux<MovieShowDetail>
   ... and so on
}

所以我遇到了这个groupBy方法,该方法只应该做这样的事情。但是,文档的内容确实不够用,尤其是关于如何遍历每部电影及其各自的Flux的内容。

此外,当我尝试通过尝试和错误学习时,处理将在执行groupBy方法之前的操作之后停止。

我试图做

fluxOfSomething
.groupBy( movieReservation -> movieReservation.getMovieId ,
movieReservation -> movieReservation) 

以便我可以遍历每个通量并创建MovieShowDetail的新通量。但是,处理永远不会进入此块。我尝试记录东西,但流程从未输入。

flux
    .map( movieSomething -> do something)
    .groupBy( movieReservation -> 
        movieReservation.getMovieId , movieReservation ->
    movieReservation)
    .subscribe("This text doesn't get printed");

我真的需要尽可能多的信息。

1 个答案:

答案 0 :(得分:0)

groupBy产生一个Flux<Flux<T>>(或更确切地说,一个Flux<GroupedFlux<T>>,它公开了每个组的密钥)。

必须订阅GroupedFlux,如Flux才能生效。因此,您需要做的是以某种方式消耗Flux产生的内部groupBy

一种典型的实现方式是使用flatMap,它已经进行了Function<T, Flux>转换。该函数可以像Function.identity()一样简单(但是如果要进一步处理内部Flux中的每个元素,则可能应该从flatMap Function内部进行处理(因为组键位于该lambda的范围。

movieReservations
    .groupBy(MovieReservation::movieId)
    .flatMap(idFlux -> idFlux
        .collectList()
        .map(listOfReservations ->
            new MovieInformation(idFlux.key(), listOfReservations)
        )
    );