减少助焊剂流

时间:2018-07-14 10:27:21

标签: spring-boot stream reactive-programming project-reactor

我在申请减少对Stream<Flux<T>>的操作时遇到一些问题,我想将其减少为Flux<T>。每个AdProvider都以Flux的形式提供商品,我想使用流从每个商品中获取所有商品并将它们连接到一个管道中。我怎么可能用reduce做到这一点?

Set<AdProvider> adProviders;

@Override
@LogBefore
public void gather()
{
    adProviders
        .parallelStream()
        .map(this::gatherOffers)
        .reduce(?)
        .subscribe();
}

private Flux<Ad> gatherOffers(AdProvider adProvider)
{
    try
    {
        return adProvider.offers();
    }
    catch(Exception e)
    {
        log.warn(EXCEPTION_WHILE_PROCESSING_OFFERS, adProvider.getClass().getSimpleName(), e);

        return Flux.empty();
    }
}

1 个答案:

答案 0 :(得分:1)

使用Stream<Flux> + Flux#fromStream()

展开Flux#flatMap()

为了解决该问题,可以结合使用Flux#fromStream()(将Stream<Flux>转换为Flux<Flux>)和Flux#flatMap()(将内部通量变平为{{1} }),如以下示例所示:

Flux

可能会注意到,我用简单的Set<AdProvider> adProviders; @Override public void gather() { Flux.fromStream(adProviders.stream()) .parallel() // replace .parallelStream with separate parallel + runOn .runOn(Schedulers.parallel()) .flatMap(this::gatherOffers) .subscribe(); } private Flux<Ad> gatherOffers(AdProvider adProvider) { try { return adProvider.offers(); } catch(Exception e) { log.warn(EXCEPTION_WHILE_PROCESSING_OFFERS, adProvider.getClass().getSimpleName(), e); return Flux.empty(); } } parallelStream + .stream替换了parallel,它们的作用几乎相同。

或者,您可以完全避免使用流,而只需依靠runOn +相同的Flux.fromIterble

Flux#flatMap